[125. 验证回文串]
难度 简单
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome
解法一:去除非字母和数字字符 + 字符串翻转判断
class Solution {
public boolean isPalindrome(String s) {
int len = s.length();
StringBuffer sBuffer = new StringBuffer();
char[] chars = s.toCharArray();
//去除 s 中的非字母和数字字符,后保存到 sBuffer 中
for(int i = 0; i < len; i++) {
if(Character.isLetterOrDigit(chars[i])) {
sBuffer.append(Character.toLowerCase(chars[i]));
}
}
//将 sBuffer 中的字符串翻转后与原字符串比较
StringBuffer reverse = new StringBuffer(sBuffer).reverse();
return sBuffer.toString().equals(reverse.toString());
}
}
解法二:去除非字母和数字字符 + 双指针判断
class Solution {
public boolean isPalindrome(String s) {
int len = s.length();
StringBuffer sBuffer = new StringBuffer();
char[] chars = s.toCharArray();
//去除 s 中的非字母和数字字符,后保存到 sBuffer 中
for(int i = 0; i < len; i++) {
if(Character.isLetterOrDigit(chars[i])) {
sBuffer.append(Character.toLowerCase(chars[i]));
}
}
chars = sBuffer.toString().toCharArray() ;
int begin = 0, end = chars.length - 1;
while(begin < end) {
if(Character.toLowerCase(chars[begin]) != Character.toLowerCase(chars[end])) {
return false;
}else {
begin++;
end--;
}
}
return true;
}
}
解法三:在原字符串上判断
class Solution {
public boolean isPalindrome(String s) {
int len = s.length();
int begin = 0, end = len - 1;
char[] chars = s.toCharArray();
while(begin < end) {
// 如果 begin 位置处为非字母和数字字符, 则 begin++
while(begin < end && !Character.isLetterOrDigit(chars[begin])) {
begin++;
}
// 如果 end 位置处为非字母和数字字符, 则 end--
while(begin < end && !Character.isLetterOrDigit(chars[end])) {
end--;
}
if(begin < end) {
// 如果忽略大小写比较不相等,则返回 false
if(Character.toLowerCase(chars[begin]) != Character.toLowerCase(chars[end])) {
return false;
}
begin++;
end--;
}
}
return true;
}
}