刷了几天的题,终于遇上连题目都看不懂的题了,瞬间觉得高大上,果然我们每个人的崇拜感都是来自于对未知区域的盲目崇拜,如果你踏进了那片区域,会发现也不过如此。期待我会有感到“不过如此”的那一天。
Given a string, determine if it is a palindrome, considering onlyalphanumeric characters (字母数字)and ignoring cases(不考虑大小写).
For example,
"A man, a plan, a canal: Panama"
is a palindrome.
"race a car"
is not a palindrome.
public class Solution {
public boolean isPalindrome(String s) {
char ch[] = s.toCharArray();
if (ch.length == 0){ //空字符串默认为有效回文
return true;
}
int flag = 1;
int i = 0;
int j = ch.length - 1;
while (flag!=0 && (i < j)){
if (flag!=0 && (i < j) && ((ch[i] >= '0' && ch[i] <= '9') || (ch[i] >= 'A' && ch[i] <= 'Z') || (ch[i] >= 'a' && ch[i] <='z'))){
if (flag!=0 && (i < j)&& ((ch[j] >= '0' && ch[j] <= '9') || (ch[j] >= 'A' && ch[j] <= 'Z') || (ch[j] >= 'a' && ch[j] <='z'))){
if(((ch[i] != ch[j]) &&Math.abs((int)(ch[i] - ch[j])) != 32) || (j - i <= 2)){
flag = 0;
break;
}
else{
i ++;
j --;
}
}
else{
j --;
}
}
else{
i ++;
}
}
if ((j - i <= 2) && ((ch[i] == ch[j]) ||Math.abs((int)(ch[i] - ch[j])) == 32)){
return true;
}
else{
return false;
}
}
}
这里需要注意的是,对于给定的String类型s变量,不能直接使用是s[i]寻找字符,会提示" array required, but String found"错误,也就是说,对String字符串不能这样操作,但是对Array数组可以,所以根据错误提示先将字符串转化为数组。
用到Math.abs也是由于错误提示, ignoring cases(不考虑大小写),所以增加了一个判断。
说实话,如果这道题没有更简便的解法的话,我会觉得题目出得没什么意义,无非就是了解了一下回文的意义,写几个循环判断一下当前字符是否是数字和字母,除了一堆冗长的判断,没什么技巧性可言。
接上!去Discuss转转总是有收获的,找到了想要用的判断字母数字的函数
public class Solution {
public boolean isPalindrome(String s) {
char ch[] = s.toCharArray();
if (ch.length == 0){
return true;
}
int flag = 1;
int i = 0;
int j = ch.length - 1;
while (flag!=0 && (i < j)){
while (flag!=0 && (i < j) && (!Character.isLetterOrDigit(ch[i]))){
i ++;
}
while (flag!=0 && (i < j) && (!Character.isLetterOrDigit(ch[j]))){
j --;
}
if(((ch[i] != ch[j]) && Math.abs((int)(ch[i] - ch[j])) != 32)|| j - i <= 2){
flag = 0;
break;
}
else{
i ++;
j --;
}
}
if ((j - i <= 2) && ((ch[i] == ch[j]) ||Math.abs((int)(ch[i] - ch[j])) == 32)){
return true;
}
else{
return false;
}
}
}
前面之所以说这题没什么技巧性,实在是因为被那一大堆大于小于搞烦了,写的过程中我真的有去找判断字符是否为字母数字的函数,但是没找到,我以为真的是没有,结果竟然在Discuss里看到有人用了嘿嘿,就是Character.isLetterOrDigit( )啦,只需要当前字符作为参数即可。真心佩服这些善用类方法的人呐,可以省去多少事啊~~
除此之外,我还发现了一个不完美的代码但是很值得学习的想法!!
public class Solution {
public boolean isPalindrome(String s) {
boolean flag = true;
String str = s.toLowerCase().replaceAll("[^a-z0-9]","");
for(int i=0; i<str.length()/2; i++){
if(str.charAt(i) != str.charAt(str.length()-1-i)){
flag = false;
<span style="white-space:pre"> </span>break;//!!!
}
}
return flag;
}
}
为什么说idea is good 呢?因为这位同学很机智地在一开始就把所有字符转化成了不会影响结果的最方便判断的形式:所有非字母数字的字符都变为""(不要以为是空格,其实是没了),还有大写字母都变成了小写的,然后一个循环直接搞定判断。
这里的break是我加上去的,因为一旦发现有不同就应该直接跳出并return false,这样就省去了后面的无用功比较。赞!