题目:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: "A man, a plan, a canal: Panama" Output: true
Example 2:
Input: "race a car" Output: false
2022.12.14 Java
呃……以前太菜了的时候写的不知道为啥想那么复杂……就是简单的双指针挪就完事了。
class Solution {
public boolean isPalindrome(String s) {
String s1 = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
int i = 0;
int j = s1.length() - 1;
while (i < j) {
if (s1.charAt(i) == s1.charAt(j)) {
i++;
j--;
} else {
return false;
}
}
return true;
}
}
下面的别看了吧。
这道题,Emmm,是有点水了点……实话实说刚开始我真的没有看出来"A man, a plan, a canal: Panama"这句话是回文序列,怀疑人生的我还去专门谷歌了一下确认了palindrome是回文序列,后来才意识到原来这道题是不算空格和非字母数字的字符的,真的很简单。只需要两个指针,一个从前往后,一个从后往前,遇到不符合条件的就跳过继续,遇到不相等的就直接return false。但是这其中还是有挺多细节要注意的:
1. 判断是否是数字或字母有一个好用的库函数叫做isalnum,它的返回值是个int,非零代表true,零代表false。
2. 在用while循环判断当前字符是否符合要求时,还应该加上begin < end的条件,因为有可能在靠近中间的地方你的begin加的太多了超过了end。写到这里我思考了一下,怎么想都没想通什么情况下begin会超过end并且出错,只好忍痛submit一次删掉以后的代码增加一次没有通过的提交,发现测试用例是".,",如果不在begin++的时候作出限制就会出现s[begin] overflow的情况。
代码如下,时间8ms,95.47%,空间9.6M,13.17%:
/*
* @lc app=leetcode id=125 lang=cpp
*
* [125] Valid Palindrome
*/
class Solution {
public:
bool isPalindrome(string s) {
int begin = 0;
int end = s.length() - 1;
while (begin < end) {
while (!isalnum(s[begin]) && begin < end) {
begin++;
}
while (!isalnum(s[end]) && begin < end) {
end--;
}
if (toupper(s[begin]) != toupper(s[end])) {
return false;
}
begin++;
end--;
}
return true;
}
};