给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
提示:
- 1 <= s.length <= 2 * 105
- 字符串 s 由 ASCII 字符组成
思路:
-
首先将字符串s中的大写字母转化为小写字母
-
其次,定义两个变量begin和end,记录字符串的首位置和末位置,然后当begin和end所指的位置上的字符符合题目时,停止,比较字符是否相同,相同继续走直到begin=end时,不同则结束返回false
代码如下:
class Solution {
public:
bool is_char(char ch)//判断字符是否为数字或字母
{
if((ch>='0'&&ch<='9')||(ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
{
return true;
}
else
{
return false;
}
}
bool isPalindrome(string s)
{
int end=s.size()-1;
int begin=0;
for(auto& m:s)
{
if(m>='A'&&m<='Z')
{
m+=32;// 将大写字母转化为小写字母
}
}
while(begin<end)
{
while(!is_char(s[begin])&&begin<end)
{
begin++;//跳过非字母和数字字符
}
while(!is_char(s[end])&&begin<end)
{
end--;//跳过非字母和数字字符
}
if(s[begin]!=s[end])
{
return false;// 两边不相等返回false
}
begin++;
end--;
}
return true;
}
};