题目描述:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。
字母和数字都属于字母数字字符。
给定一个字符串s,如果它是回文串,返回true;否则,返回false。
- s仅由可打印的ASCII字符组成
- 1<=s.length<=2*100000
题目分析:
- 引入双指针left,right,跳过非数字字母字符,其中left从前向后寻找第一个有效字符,right从后往前寻找第一个有效字符,若left!=right,找到反例,直接return false;
- left++,right–,继续上述流程,直至整个字符串遍历结束,left>=right,终止条件,说明此时没有反例,return true
代码实现:
//判断回文串
public static boolean isPalindrome(String s)
{
//1.为了判断方便,直接将s转小写处理
s=s.toLowerCase();
//2.引入两个引用
int left=0;
int right=s.length()-1;
//3.循环判断
while(left<right)
{
//从左往右查找第一个有效数字字母字符
while(left<right && !isVaildChar(s.charAt(left)))
{
//如果不是有效字符,则left++,进行跳过
left++;
}
//从右向左查找第一个有效字符
while(left<right && !isVaildChar(s.charAt(right)))
{
right--;
}
//是有效字符,进行比较
if(s.charAt(left)!=s.charAt(right))
{
//找到反例
return false;
}
//继续进行下一轮匹配
left++;
right--;
}
//循环结束,没有找到反例,则返回true
return true;
}
public static boolean isVaildChar(char c)
{
if(c>='a' && c<='z')
{
return true;
}
if(c>='0' && c<='9')
{
return true;
}
return false;
}