[Lc]125验证回文串
Contents
题目
题解
双指针,挨个比较,注意的是跳过非数字字母,还有大写字母要转化成小写
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
七个重要的c++内置函数,摘自https://leetcode-cn.com/problems/valid-palindrome/solution/9877-ci-ti-mu-de-shou-xi-7ge-zi-mu-shu-zi-pan-duan/
islower(char c) //是否为小写字母
isupper(char c) //是否为大写字母
isdigit(char c) //是否为数字
isalpha(char c) //是否为字母
isalnum(char c) //是否为字母或者数字
toupper(char c) //字母小转大
tolower(char c) //字母大转小
class Solution {
public:
bool isPalindrome(string s) {
if(s.empty()) return true;//特殊情况
int left = 0, right = s.size()-1;//两个指针
while(left<right){//两个指针相遇停止迭代,就挨着就可以停了
while(!isalnum(s[left]) && left<right) left++;//若不为数字或字母,就跳过
while(!isalnum(s[right]) && right>left) right--;//同上
char tmp_left = isupper(s[left])? tolower(s[left]) : s[left];
char tmp_right = isupper(s[right])? tolower(s[right]) : s[right];//若为大写字母,转化为小写字母
if(tmp_left != tmp_right) return false;//转化完成后,若不相等,直接返回false
left++;
right--;//移动指针
}
return true;//遍历完成返回true
}
};
Author ChrisHRZ
LastMod 2020-05-06