题目:如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
关键点1:忽略或者说剔除非字母数字字符
使用isLetterOrDigit()函数
Character.isLetterOrDigit(s.charAt(right))
用ASCII码判断。a~z是97~122.
if((s.charAt(i)-'0')>=0&&(s.charAt(i)-'0')<=9||(int)(s.charAt(i))>=97&&(int)(s.charAt(i))<=122){
S.append(s.charAt(i));
}
另设函数:
private boolean isValid(char c){
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
}
}
关键点2:判回文。
1: 经典双指针
int l=0,r=S.length-1;
while(l<r){
//略过非字母数字字符
while(l<r&&!isvaild(S[l])){
l++;
}
while(l<r&&!isvaild(S[r])){
r--;
}
//比较
if(S[l]!=S[r]){return false;}
l++;r--;
}return true;
2:使用StringBuilder的reverse()方法。
StringBuilder S=new StringBuilder();
//......
String s1 = S.toString();
String s2 = S.reverse().toString();
return s1.equals(s2);
代码:
1: 经典:
class Solution {
public boolean isPalindrome(String s) {
char[]S=s.toLowerCase().toCharArray();
int l=0,r=S.length-1;
while(l<r){
//略过非字母数字字符
while(l<r&&!isvaild(S[l])){
l++;
}
while(l<r&&!isvaild(S[r])){
r--;
}
//比较
if(S[l]!=S[r]){return false;}
l++;r--;
}return true;
}
private boolean isvaild(char c){
return c>='a'&&c<='z'||c>='0'&&c<='9';
}
}
2: 不经典(自己写的)
class Solution {
public boolean isPalindrome(String s) {
s=s.toLowerCase();
StringBuilder S=new StringBuilder();
int n=s.length();
for(int i=0;i<=n-1;i++){
if((s.charAt(i)-'0')>=0&&(s.charAt(i)-'0')<=9||(int)(s.charAt(i))>=97&&(int)(s.charAt(i))<=122){
S.append(s.charAt(i));
}
}
String s1 = S.toString();
String s2 = S.reverse().toString();
return s1.equals(s2);
}
}