条件
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
**;否则,返回 **false
**。
分析
1.将所有字符串的大写字符转换成小写字符
s = s.toLowerCase();
2.移除所有非字母和数字字符
-
2.1.判断是不是字符或数字
if(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9') { return true; } return false;
等价于if(Character.isDigit(ch) || Character.isLetter(ch)) {
- 2.2跳过不是字符或数字的标点符号
int left = 0;
int right = s.length()-1;
while(left < right) {
//1. left走到合法的字符底下
while(left < right && !isCharacterNum( s.charAt(left))) {
left++;
}
while(left < right && !isCharacterNum( s.charAt(right))) {
right--;
}
//left一定指向的是合法的字符 !isCharacterNum( s.charAt(left))
//right一定指向的是合法的字符 !isCharacterNum( s.charAt(right))
//判断这两个下标的字符一样不一样 while(left < right)
3.正着读反着读一样返回true,不一样返回false
if(s.charAt(left) == s.charAt(right)) {
left++;
right--;
}else {
return false;
}
}
return true;//走到头的时候,left和right相等的时候跳出循环,直接为true。
}
完整代码
class Solution {
public boolean isPalindrome(String s) {
//将字符串变成小写的
s = s.toLowerCase();
int left = 0;
int right = s.length()-1;
while(left < right) {
//1. left走到合法的字符底下
while(left < right && !isCharacterNum( s.charAt(left))) {
left++;
}
while(left < right && !isCharacterNum( s.charAt(right)) ) {
right--;
}
//left一定指向的是合法的字符
//right一定指向的是合法的字符
//判断这两个下标的字符一样不一样
if(s.charAt(left) == s.charAt(right)) {
left++;
right--;
}else {
return false;
}
}
return true;
}
private boolean isCharacterNum(char ch) {
if(Character.isDigit(ch) || Character.isLetter(ch)) {
return true;
}
return false;
}
}