题意整理:

本题题意非常清晰,既判断给定字符串是否为回文字符串,回文字符串满足一个性质,既以字符串中间为对称点,与对称点距离相等的点值相等

方法一:翻转后对比

核心思想:

回文串的性质既第一个字符与最后一个字符相等,第二个字符与倒数第二个字符相等...。也即
可以使用一个字符串表示原字符串反转后结果。如果原本的字符串是回文串,那么翻转后的字符串应该与原字符串相等,否则说明原字符串不是回文串

核心代码:

class Solution {
public:
    bool judge(string str) {
        string res = str;
        reverse(res.begin(), res.end());//翻转字符串
        return res == str;//比较是否相等
    }
};

复杂度分析:

时间复杂度:,翻转字符串和对比两个字符串的时间复杂度都是
空间复杂度:,需要第二个字符串表示原字符串的翻转后结果

方法二:双指针

核心思想:

方法一为了比较字符 是否相等,利用了字符串表示翻转后结果并进行比较,需要的空间。实际上可以利用两个指针进行动态的比较,这样无需复制字符串的翻转结果,直接对原字符串上的字符进行比较即可。
图片说明

核心代码:

class Solution {
public:
    bool judge(string str) {
        int i = 0, j = str.length() - 1;
        while(i < j) {
            if(str[i] == str[j]) {
                ++i;//移动左指针
                --j;//移动右指针
            } else {
                //出现字符不相等,说明不是回文串
                return false;
            }
        }
        return true;//全部字符符合回文特性,说明这是回文串
    }
};

复杂度分析:

时间复杂度:,需要遍历字符串一次
空间复杂度:,仅使用了常数个变量,既两个指向元素的指针(此处为int 值表示下标)