题意整理:
本题题意非常清晰,既判断给定字符串是否为回文字符串,回文字符串满足一个性质,既以字符串中间为对称点,与对称点距离相等的点值相等
方法一:翻转后对比
核心思想:
回文串的性质既第一个字符与最后一个字符相等,第二个字符与倒数第二个字符相等...。也即 。
可以使用一个字符串表示原字符串反转后结果。如果原本的字符串是回文串,那么翻转后的字符串应该与原字符串相等,否则说明原字符串不是回文串
核心代码:
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 值表示下标)