描述
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
示例
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
算法思路1
本题为验证只包含字母数组的字符串是否是回文串,即前后字符是否一一对应相等,因此想到将输入字符通过去符号化,小写化将其转换为只包含数字和小写字母的字符串,之后设置头尾指针,依次判断对应位置的字符是否相等即可,
答案1
class Solution {
public boolean isPalindrome(String s) {
String [] t=s.split("[^a-zA-Z0-9]");
String m= String.join("",t);
String p=m.toLowerCase();
//System.out.println(p);
for(int i=0,j=p.length()-1;i<p.length()/2;i++,j--){
if(p.charAt(i)!=p.charAt(j)){
return false;
}
}
return true;
}
}
String [] t=s.split("[^a-zA-Z0-9]"); String m= String.join("",t); String p=m.toLowerCase();
可以优化一下,直接用“”替代非数字和字母即可。
String p = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
算法思路2
这个代码片段首先将输入字符串转换为小写,然后移除所有非字母数字字符。最后,它将得到的字符串与其反转后的字符串进行比较,以确定是否为回文串。
答案2
public class Solution {
public boolean isPalindrome(String s) {
// 将所有大写字符转换为小写字符
s = s.toLowerCase();
// 移除所有非字母数字字符
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
sb.append(c);
}
}
// 检查翻转后的字符串是否与原字符串相同
String reversed = sb.toString();
return reversed.equals(new StringBuilder(reversed).reverse().toString());
}
}
详解2
StringBuilder类用法详见:
Java中的常见类“StringBuilder、StringBuffer类”(四)用法详解-CSDN博客
Character类用法详见: