题目
1.题目
给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
2.注意事项
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
3.例子
在这个题目中,我们将空字符串判定为有效回文。
样例
“A man, a plan, a canal: Panama” 是一个回文。
“race a car” 不是一个回文。
解法1
解法分析:
首先我们要将字符串s中的非字母数字元素剔除,用到了Character.isLetter(c),Character.isDigit(c)分别判断是否是字母、数字,Character.isLetterOrDigit(c) 判断是否是字母或数字;
然后将获得的字符串转为小写,并转成char[];
最后进行遍历判断。
public class Solution {
/**
* @param s A string
* @return Whether the string is a valid palindrome
*/
public boolean isPalindrome(String s) {
StringBuffer buffer = new StringBuffer();
for (char c : s.toCharArray()){
//判断是否是字母或者数字
if (Character.isLetterOrDigit(c)){
buffer.append(c);
}
}
//转成全是小写的char数组
char[] chars = buffer.toString().toLowerCase().toCharArray();
int n = chars.length;
//遍历到一半就行
for (int i = 0; i < n/2; i++){
if (chars[i] != chars[n - i - 1]){
return false;
}
}
return true;
}
}
解法2
进一步分析:本题目是典型的使用对撞指针的题目,上面的解法并没有很好的使用这一点,只是单纯的重新筛选组合,相比来讲,下面的这个更好。
public class Solution {
/**
* @param s A string
* @return Whether the string is a valid palindrome
*/
public boolean isPalindrome(String s) {
s = s.toLowerCase();
char[] chars = s.toCharArray();
for(int i = 0, j = s.length() - 1; i < j; i++, j--){
while (Character.isLetterOrDigit(chars[i]) == false && i<j) {
i++;
}
while (Character.isLetterOrDigit(chars[j]) == false && i<j) {
j--;
}
if (chars[i] != chars[j]){
return false;
}
}
return true;
}
}
题目地址:http://www.lintcode.com/zh-cn/problem/valid-palindrome/