问题描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串 示例 2: 输入: "race a car" 输出: false 解释:"raceacar" 不是回文串 提示: 1 <= s.length <= 2 * 105 字符串 s 由 ASCII 字符组成
方法1:筛选,判断
首先将字符串中的无效字符剔除,用 builder 保存,将 builder 反转并用一个变量 reverse 保存,最后返回 builder 与 reverse equals 的结果。
Character.isLetterOrDigit(ch): 判断 ch 是否是字母或是数字
代码
StringBuilder builder = new StringBuilder();
int len = s.length();
for(int i = 0;i < len;i++){
if(Character.isLetterOrDigit(s.charAt(i))){
builder.append(Character.toLowerCase(s.charAt(i)));
}
}
StringBuilder reverse = new StringBuilder(builder).reverse();
return reverse.toString().equals(builder.toString());
执行结果
info
解答成功:
执行耗时:4 ms,击败了50.98% 的Java用户
内存消耗:38.2 MB,击败了90.65% 的Java用户
方法2:双指针
用两个指针 left 和 right 分别指向字符串的首和尾,然后依次进行判断;本题 只考虑 字母大小写和数字字符,当两个指针都在这个范围内时只需要判断是否相等即可,若有不存在这个范围内的字符,我们需要将对应位置上的指针向前或是向后移动。
代码
if ("".equals(s.trim())) {
return true;
}
s = s.toLowerCase();
for (int i = 0, j = s.length() - 1; i < j; ) {
if (!((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= '0' && s.charAt(i) <= '9'))) {
i++;
continue;
}
if (!((s.charAt(j) >= 'a' && s.charAt(j) <= 'z') || (s.charAt(j) >= '0' && s.charAt(j) <= '9'))) {
j--;
continue;
}
if (s.charAt(i) == s.charAt(j)) {
i++;
j--;
continue;
}
return false;
}
return true;
执行结果
info
解答成功:
执行耗时:3 ms,击败了76.16% 的Java用户
内存消耗:38.2 MB,击败了93.91% 的Java用户