如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。
class Solution {
public boolean isPalindrome2(String s) {
s=s.toLowerCase();
s=s.replaceAll("[^a-z0-9]", "");
int left = 0,right =s.length()-1;
while(left<right){
if(s.charAt(left)!=s.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
public boolean isPalindrome1(String s) {
StringBuffer sgood = new StringBuffer();
int length = s.length();
for(int i=0;i<length;i++){
char ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
sgood.append(Character.toLowerCase(ch));
}
}
StringBuffer sgood_rev=new StringBuffer(sgood).reverse();
return sgood.toString().equals(sgood_rev.toString());
}
}
我这里用两种方法实现了一下
isPalindrome2这段代码实现了判断一个字符串是否为回文串的功能。以下是它的详细代码思路:
s
中的所有大写字母转换为小写字母,以确保大小写不影响回文串的判断结果。这是通过调用 s.toLowerCase()
方法实现的。
[^a-z0-9]
匹配所有非字母数字字符,并将其替换为空字符串。这样做的目的是去除字符串中的所有非字母数字字符,只保留字母和数字。这是通过调用 s.replaceAll("[^a-z0-9]", "")
实现的。
left
和 right
分别指向处理后字符串的起始和末尾位置。每次迭代中,比较 left
和 right
指向的字符是否相等,如果不相等,则返回 false
,表明不是回文串。如果相等,则将 left
向右移动一位,将 right
向左移动一位,直到 left
不小于 right
为止。如果在这个过程中没有返回 false
,则说明是回文串,返回 true
。
这就是整段代码的详细思路,它首先对字符串进行预处理,然后使用双指针法进行回文串的判断。
isPalindrome1这段代码实现了判断一个字符串是否为回文串的功能。它的思路是:
StringBuffer
对象 sgood
,用于存储经过处理后的字符串。s
,将其中的字母和数字字符转换为小写字符,并添加到 sgood
中。StringBuffer
对象 sgood_rev
,用于存储 sgood
的逆序字符串。sgood
和 sgood_rev
是否相等,若相等则说明原始字符串 s
是回文串,返回 true
;否则返回 false
。这个实现与之前给出的实现相似,只是使用了 StringBuffer
类来构建处理后的字符串,以及对字符是否为字母或数字的判断。这种实现方式也是正确的,能够有效地判断一个字符串是否为回文串。