1、题目描述
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: s = "race a car" 输出: false 解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105- 字符串
s由 ASCII 字符组成
2、解题思路
1.预处理阶段 - 数据清洗
java
StringBuilder filter = new StringBuilder();
for (char c : s.toCharArray()){
if (Character.isLetterOrDigit(c)){ //只保留字母和数字
filter.append(Character.toLowerCase(c)); //统一将字母转为小写,用于比较
}
}
String str = filter.toString();
目的:将原始字符串转换为只包含小写字母和数字的"纯净"字符串
-
过滤掉所有标点符号、空格等非字母数字字符
-
统一转换为小写,消除大小写差异
2. 验证阶段 - 双指针判断回文
算法:使用两个指针从字符串两端向中间移动
-
left从左边开始,right从右边开始 -
比较对应位置的字符是否相等
-
如果发现不相等,立即返回
false -
如果所有对应字符都相等,返回
true
3、代码实现
import java.util.*;
import java.io.*;
class Solution {
public static boolean isPalindrome(String s){
//1.使用双指针比对
//2.使用Character.isLetterOrDigit()只保留数字和字母
if (s.length()==0 || s == null){
return true;
}
StringBuilder filter = new StringBuilder();
for (char c : s.toCharArray()){
if (Character.isLetterOrDigit(c)){ //只保留字母和数字
filter.append(Character.toLowerCase(c)); //统一将字母转为小写,用于比较
}
}
String str = filter.toString();
int left = 0;
int right = str.length() - 1;
while (left<right){
if (str.charAt(left) != str.charAt(right)){
return false;
}
left++;
right--;
}
return true;
}
}
3728

被折叠的 条评论
为什么被折叠?



