125验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
解法一:遍历StringBuilder修改值,最后判断是否回文
public boolean isPalindrome(String s) {
StringBuilder str=new StringBuilder(s);
s="";
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)>=65 && str.charAt(i)<=90)
{
char c=(char) (str.charAt(i) + 32);;
str.setCharAt(i, c);
}else if(str.charAt(i)>=97 && str.charAt(i)<=122 ||(str.charAt(i)>=48 && str.charAt(i)<=57)){
continue;
}else
{
str.deleteCharAt(i);
i--;
}
}
String s1=str.toString();
String s2=str.reverse().toString();
System.out.println(s1);
System.out.println(s2);
return s1.equals(s2);
}
解法二:双指针
这段代码的思路是先将字符串中的大写字母转换为小写字母,然后移除所有非字母数字字符。
然后通过双指针法,从字符串的两端向中间遍历,比较对应位置的字符是否相等。
如果所有对应位置的字符都相等,则说明字符串是回文串,返回true
;否则返回false
。
public boolean isPalindrome(String s) {
int i=0,j=s.length()-1;
char c1=' ',c2=' ';
while(i<j)
{
boolean f1=true,f2=true;
//i
if(s.charAt(i)>=65 && s.charAt(i)<=90)
{
//大写要转小写
c1=(char)((int)s.charAt(i)+32);
}else if(s.charAt(i)>=97 && s.charAt(i)<=122 ||(s.charAt(i)>=48 && s.charAt(i)<=57)){
//正常字符与数字
c1=s.charAt(i);
}else
{
//其他字符舍去,不做比较
f1=false;
i++;
}
//j
if(s.charAt(j)>=65 && s.charAt(j)<=90)
{
//大写要转小写
c2=(char)((int)s.charAt(j)+32);
}else if(s.charAt(j)>=97 && s.charAt(j)<=122 ||(s.charAt(j)>=48 && s.charAt(j)<=57)){
//正常字符与数字
c2=s.charAt(j);
}else
{
//其他字符舍去,不做比较
f2=false;
j--;
}
//判断什么时候能比较
if(f1 && f2)
{
if(c1==c2)
{
//i与j要成功过才能++
i++;
j--;
}else{
return false;
}
}
}
return true;
}