分析
这道题最直观的方法就是利用双指针进行前后遍历。
我们可以先利用 erase()
配合 remove_if()
以及 isalnum()
移除所有非法字符。
然后利用 transform()
将所有字符转换为小写。
接着就可以使用双指针进行前后遍历判断是否回文了。
当然,我们还可以直接在原字符串上判断,从而节省额外空间。
我们可以利用上文提到的 isalnum()
函数,在遇见非法字符时进行跳过。
然后直接利用 tolower()
对字符进行立即转换并判断。
解答
class Solution {public: bool isPalindrome(string s) { int n = s.size(); auto left = 0, right = n - 1;
while (left < right) { while (left < right && !isalnum(s[left])) left++; while (left < right && !isalnum(s[right])) right--; if (left < right) if (tolower(s[left++]) != tolower(s[right--])) return false; }
return true; }};