描述:判断输入的字符串是否是回文字符串。回文宇符串是指正向和反向拼写都相同的字符串。 要求:忽略字符串中的非字母字符,只考虑宇母宇符的比较。在判断回文性时,不区分字母的大小写。

题目:检测回文字符串
描述:判断输入的字符串是否是回文字符串。回文宇符串是指正向和反向拼写都相同的字符串。
要求:忽略字符串中的非字母字符,只考虑宇母宇符的比较。在判断回文性时,不区分字母的大小写。遍历宇符串时必须采用字符指针实现。
提示:可以使用两个指针,一个指向字符串的起
始位置,另一个指向宇符串的末尾位置,逐个字符进行比较,直到两个指针相遇。在比较字符
时,可以忽略非字母字符,只比较字母字符的小写形式。
如果遇到不匹配的宇符,则宇符串不是回文字符串。如果两个指针相遇,字符串是回文字符串。
示例:
输入:str =mevel"
输出:true
输入:str = mle23vel
输出:true
输入:str = mhello"
输出:false

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
     int i,j,n=0,flag;
     char a[101];
     cin.getline(a,sizeof(a));
     int k = 0;
     for (i = 4; a[i]; i++) //这里不知道你的输入是否有str=开头,如果没有,那么i=0
    {
        if (a[i] >= 'a' && a[i] <= 'z')
        a[k++] = a[i] - 'a' + 'A';
        else if (a[i] >= 'A' && a[i] <= 'Z')
        a[k++] = a[i];     
    }
    a[k] = '\0';
    // cout << a << endl;
     n=strlen(a);
     flag=0;
     for (i=0,j=n-1;i<n/2;i++,j--)
         if (a[i]!=a[j])  
                flag=1;    
     if (!flag)
        cout<<"true"<<endl;
     else
           cout<<"false"<<endl;
    return 0;
}    


img

img

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7486456
  • 除此之外, 这篇博客: Educational Codeforces Round 102 (Rated for Div. 2)中的 思路:首先考虑在没有删除的情况下,一系列操作过程中,能变成多少不同的值。x初始为0,随着+±-的变化,会来回反复横跳,那么两个关键点就是最大值和最小值,这说明从最大值到最小值之间的数字,都是在操作过程中出现。所以只需要考虑一个区间内的操作产生的最大最小值。但是题目要删掉,中间一段,剩下两段,也就是要把两段合并起来。画个图其实更好理解。红色的是所有的操作,绿色的是要删除的操作,第二个曲线就是合并之后的x值变化曲线。由图可知。后面那部分合并过来之后,起点就是前面那部分的终点!这就是关键点。然后前面那部分的区间的最大最小值和当前值都很好维护。难的是后面那部分怎么维护。后面那部分,从后往前维护,每到一个点,都认为这个点是零点,然后计算最大值最小值。因为是反着来,可以发现操作曲线是一个与 原操作 关于x轴对称的曲线,所以最大值就是最小值,最小值就是最大值。然后最小值就是 当前点到最小值的距离,最大值就是 当前点到最大值的距离。之所以算距离,是因为,永远认为当前点是0点。所以 距离 才是真正的最大最小值。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
        char s[100];                        //定义一个字符数组,用于存放输入的字符串
        char *p1, *p2;                      //定义两个指针,一个指向字符串的起始位置,另一个指向字符串的末尾位置
    
        printf("Please enter a string: ");
        fgets(s, 100, stdin);               //fgets()可读入含空格的字符串
    
        p1 = s;                             //p1指向字符串的起始位置
        p2 = s + strlen(s) - 1;             //p2指向字符串的末尾位置,用strlen(s)-1可以跳过字符串的结束符'\0'
    
        while (p1 < p2) {                   //只要p1和p2没有相遇则继续判断
            while (!isalpha(*p1) && p1 < p2)   //跳过非字母字符
                p1++;
            while (!isalpha(*p2) && p1 < p2)
                p2--;
            if (tolower(*p1) != tolower(*p2)) { //忽略大小写比较
                printf("%s is not a palindrome string.\n", s);
                return 0;
            }
            p1++;                           //指针后移
            p2--;
        }
        printf("%s is a palindrome string.\n", s);
        return 0;
    }