本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41488377
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)对String类中的valueOf()方法、charAt()方法、equalsIgnoreCase()方法有所了解,并知道如何使用。
(2)对Character类中的isLetterOrDigit()方法有所了解。
(3)理解解题思路,提高分析问题的能力。
注:
String类: valueOf()方法——返回指定类型参数的字符串表示形式。
charAt(char c)方法——返回指定索引处的 char
值。
equalsIgnoreCase()方法——对两个String进行比较,不考虑大小写。
Character类:
isLetterOrDigit(char c)方法——确定指定字符是否为字母或数字。
思路:
(1)解读题意:1. 需要去掉非数字和非字母字符,对剩余字符串是否为回文串进行判断。说白了就是判断该字符串是否轴对
称。2. 空字符串是回文的。3.只含有标点或其它特殊符号的字符串是回文的。
(2)既然是判断字符串是否轴对称,那么,分别从字符串起始位置和结束位置开始进行比较,对于开始字符或者结束字符,首
先判断其是否为数字或字母,如果不是,对于开始位置,则继续向右寻找第一个是字母或者数字的字符,对于结束位置,则继续
向左寻找第一个是字母或者数字的字符,如果从起始位置向右或者结束位置向左遍历完整个字符串还未找到第一个出现的数值为
字母或数字的字符,则返回true。
(3)如果起始位置对应字符和结束位置对应字符都是字母或者数字,但数值不同,则不是回文字符串,返回false;如果相同,
则起始位置右移,结束位置左移,继续按照(2)进行判断,依此类推,如果都判断完成且没有返回false,那么说明字符串为回文
串,返回true。
算法实现代码如下所示:(PS:本人技术有限,目前尚不能写出简短高效的代码,大家有好的算法希望能够分享,谢谢)
public boolean isPalindrome(String s) {
if (s.length() == 0) return true;
int len = s.length();
int start = 0;
int end = len - 1;
while (start != end && start < end) {
String s1 = "";
String s2 = "";
while (start < len) {
if (Character.isLetterOrDigit(s.charAt(start)) != true) {
start++;
} else {
s1 = String.valueOf(s.charAt(start));
break;
}
}
if (start == len - 1
&& Character.isLetterOrDigit(s.charAt(start)) == true)
return true;
while (end > 0) {
if (Character.isLetterOrDigit(s.charAt(end)) != true) {
end--;
} else {
s2 = String.valueOf(s.charAt(end));
break;
}
}
if (end == 0 && Character.isLetterOrDigit(s.charAt(end)) == true)
return true;
if (s1.equalsIgnoreCase(s2)) {
start++;
end--;
} else {
return false;
}
}
return true;
}