题目链接:https://leetcode.com/problems/valid-palindrome/
题目:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
解题思路:
这道题对我来说意义很有意义,因为它是我暑假面试中遇到的一道题!!!
另外一道是 1 Two Sum 如此看来当时面试的几道题基本都来自 leetcode !!!
因为当时面试官给出了解答,所以至今记得解题思路。
- 这道题只考虑数字和字母(字母有大小写之分),所以遇到其它符号时,自动跳过。
- 具体来说就是,分别从字符串两边向中间遍历,遇到非数字和字母的符号就跳过,直至左右两个指针遇到。
这题有些隐藏的小细节需要注意。
1. 字母有大小写之分,比较之前应该先统一转变为小写或大写。
2. 如果输入的字符串没有数字或字母,该字符串仍然看做是回文。
3. 在指针向中间靠拢的过程中,若指针一直没有遇到数字或字母,就会一直加加或减减,此时应注意判断指针是否越界。
代码实现:
public class Solution {
public boolean isPalindrome(String s) {
if(s == null || s.length() == 0 || s.length() == 1)
return true;
int l = 0;
int r = s.length() - 1;
while(l < r) {
char lc = s.charAt(l);
while((lc < '0' || lc > '9') && (lc < 'A' || lc > 'Z') && (lc < 'a' || lc > 'z')) {
if(l >= r)
break;
l ++;
lc = s.charAt(l);
}
char rc = s.charAt(r);
while((rc < '0' || rc > '9') && (rc < 'A' || rc > 'Z') && (rc < 'a' || rc > 'z')) {
if(l >= r)
break;
r --;
rc = s.charAt(r);
}
if(Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))
return false;
l ++;
r --;
}
return true;
}
}
475 / 475 test cases passed.
Status: Accepted
Runtime: 9 ms