
思路分析
1. 字符过滤与标准化
string s1;
for (int i = 0; i < n; i++) {if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {s1 += s[i]; } else if (s[i] >= 'A' && s[i] <= 'Z') {s1 += (s[i] + 32); }
}
- 过滤逻辑:
- 保留数字(
'0'-'9'
)和小写字母('a'-'z'
)。 - 将大写字母(
'A'-'Z'
)转换为小写(通过 ASCII 码 +32
)。
- 结果:生成只包含字母数字且全小写的字符串
s1
。
2. 回文验证
int left = 0, right = n1 - 1;
while (left < right) {if (s1[left] == s1[right]) {left++;right--;} else {return false; }
}
return true;
- 双指针法:
left
从头部开始,right
从尾部开始。- 如果字符相等,向中间移动指针;否则直接返回
false
。
- 终止条件:
- 当
left >= right
时,说明所有字符均匹配,返回 true
。
class Solution {
public:bool isPalindrome(string s) {string s1;int n=s.size();for(int i=0;i<n;i++){if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')){s1+=s[i];}else if(s[i]>='A'&&s[i]<='Z'){s1+=(s[i]+32);}}int n1=s1.size();int left=0,right=n1-1;while(left<right){if(s1[left]==s1[right]){left++;right--;}else{return false;}}return true;}
};