LeetCode 125
https://leetcode.cn/problems/valid-palindrome/description/
难度:简单
高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/
初始化一左一右两个指针 i=0,j=n−1。其中 n 是 s 的长度。
C++ 判断字符的常用函数如下:
1. 判断字符是否为数字:isdigit(c)
2. 判断字符是否为字母或数字:isalnum(c)
3. 判断字符是否为字母:isalpha(c)
4. 判断字符是否为大写字母:isupper(c)
5. 判断字符是否为小写字母:islower(c)
6. 将大写字母转换为小写:tolower(c)
7. 将小写字母转换为大写:toupper(c)
分类讨论:
如果 s[i] 既不是字母也不是数字,右移左指针,也就是把 i 加一。 如果 s[j] 既不是字母也不是数字,左移右指针,也就是把 j 减一。 否则,如果 s[i] 和 s[j] 转成小写后相等,那么把 i 加一,把 j 减一,继续判断。 否则,s 不是回文串,返回 false。 循环直到 i≥j 为止。最后返回 true。
时间复杂度:O(n),其中 n 是 s 的长度。
空间复杂度:O(1)。
class Solution {
public:
bool isPalindrome(string s) {
int i = 0, j = s.size() - 1;
while (i < j) {
if (!isalnum(s[i])) {
i++;
} else if (!isalnum(s[j])) {
j--;
} else if (tolower(s[i]) == tolower(s[j])) {
i++;
j--;
} else {
return false;
}
}
return true;
}
};