题目及要求
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
示例 2:
输入: s = “race a car”
输出: false
解释:“raceacar” 不是回文串
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
双指针
思路:定义两个指针分别指向字符串的开头和结尾进行逐一对比,如果出现所指的字符串不相等说明不是回文串返回false,否则返回true
时间复杂度为:O(n)
空间复杂度为:O(1)
class Solution {
public:
bool isPalindrome(string s) {
for(int i=0;i<s.size();++i){
if(s[i]>='a'&&s[i]<='z'){
s[i]=s[i]-'a'+'A'; //将小写字母转换为对应的大写字母
}
}
int l=0,r=s.size()-1; //定义指针l和r,分别指向字符串的开头和结尾
while(l<r){
if(!(s[l]>='A'&&s[l]<='Z'||s[l]<='9'&&s[l]>='0')){ //如果字符不是大写字母或数字
++l;
continue;
}
if(!(s[r]>='A'&&s[r]<='Z'||s[r]<='9'&&s[r]>='0')){
--r;
continue;
}
if(s[l]!=s[r]){ //如果指针l和r所指向的字符不相等
return false; //返回false,说明不是回文串
}
++l; //将指针l向右移动一位
--r; //将指针r向左移动一位
}
return true; //循环结束后都没有发现不相等的字符,说明是回文串,返回true
}
};