原文链接:125. 验证回文串 - 力扣(LeetCode)
题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s 仅由可打印的 ASCII 字符组成。
补充:
Character.isLetter(ch) 判断ch是否为字母
Character.isDigit(ch) 判断ch是否为数字
Character.isLetterOrDigit(ch) 判断ch是否为字母或数字
Character.isLowerCase(char ch) 判断这个字符是不是小写字母
Character.isUpperCase(char ch) 判断这个字符是不是大写字母
Character.isWhitespace(char ch) 判断这个字母是不是一种空格
Character.toLowerCase(char ch) 把这个字母转换成小写
Character.toUpperCase(char ch) 把这个字母转换成大写
题解
方法一:
解题思路:前后同时寻找是字母或数字的元素
时间:3ms 空间:40.9MB
class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();//大写转小写
int i=0,j=s.length()-1;
while(i<j){
while (i<j&&!Character.isLetterOrDigit(s.charAt(i))) {
++i;
}
while (i<j&&!Character.isLetterOrDigit(s.charAt(j))) {
--j;
}
//前后都是字母或数字时进行比较
if(i<j){
if(s.charAt(i)!=s.charAt(j)){
return false;
}
++i;
--j;
}
}
return true;
}
}
方法二:
解题思路:一次遍历,将字母数字添加到数组中,然后再将他反转,与原式进行比较
时间:4ms 空间:41MB
class Solution {
public boolean isPalindrome(String s) {
if(s.length()==1)return true;
//将大写字母全部转化为小写
s = s.toLowerCase();
StringBuffer str = new StringBuffer();
for(int i=0;i<s.length();i++){
//比较当前字符是否在0-9或者a-z的范围内
if(('0'<=s.charAt(i)&&s.charAt(i)<='9')||(s.charAt(i)>='a'&&s.charAt(i)<='z')){
str.append(s.charAt(i));
}
}
return str.toString().equals(str.reverse().toString());
}
}