1.题目描述
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串
2.解题思路与代码
2.1 解题思路
这道题目分为两步,第一步处理字符串 s 去除多余字符仅保留字母和数字,第二部判断处理后的字符串是否为回文串。首先去除字符串中非字母和数字的部分,因为题目要求忽略大小写,因此在去除的过程中如果遇到大写字母,则全部转为小写,代码如下
StringBuilder builder = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ((c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
if (c >= 65 && c <= 90) {
c += 32;
}
builder.append(c);
}
}
s = builder.toString();
通过上面的代码,我们滤出了非字母和数字部分,并且将大写字母同时转换成的小写字母,得到新的字符串 s 。接下来就是判断 s 是否为回文串了。使用 left 和 right 指向新 s 的头和尾部,然后判断 left 和 right 对应字符是否相同,如果不同则不是回文串,直接返回 false;如果相同,则 left 和 right 同时向中间移动,即 left 右移一位、right 左移一位。
2.2 代码
class Solution {
public boolean isPalindrome(String s) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ((c >= 48 && c <= 57) || (c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
if (c >= 65 && c <= 90) {
c += 32;
}
builder.append(c);
}
}
s = builder.toString();
if (s.length() == 0) {
return true;
}
int l = 0;
int r = s.length() - 1;
while (l <= r) {
if (s.charAt(l) != s.charAt(r)) {
return false;
}
l++;
r--;
}
return true;
}
}
2.3 测试结果
通过测试
3.总结
- 首先处理字符串保留字母和数字,同时大写字母转换成小写字母
- 通过 left 和 right 两个变量判断是否为回文