这道题思路很简单,把字符串拆成单个字符,过滤掉非数字字母,留下的数组从前和后同时开始比对,如果出现不同则非回文。
注意的有,题目中不区分大小写,Aa也是回文,所以判断时不能只是用char来==,还要判断差的绝对值是否为32。
还有如果while中优势需要i++的可以直接用a[i++]即可,但是要注意if的条件里不要出现两次a[i++]
还有就是记住 '0'-'9'==48-57
'A'-'Z'==65-90
'a'-'z'==97-122
还有如果不用分隔出来单词,要分隔出字符,使用charAt()比split("")好用
public static boolean isPalindrome(String s) {
int num=s.length();
char[] sa = new char[num];
int j=0;
for (int i = 0; i <num ; i++) {
if(s.charAt(i)>47&&s.charAt(i)<58) sa[j++]=s.charAt(i);
else if(s.charAt(i)>64&&s.charAt(i)<91) sa[j++]=s.charAt(i);
else if(s.charAt(i)>96&&s.charAt(i)<123) sa[j++]=s.charAt(i);
}
int i=0;
j--;
while (i<j){
if(sa[i]!=sa[j]&&Math.abs(sa[i]-sa[j])!=32) return false;
i++;
j--;
}
return true;
}Update 2015/08/18: 上面的做法新建了一个char数组其实是没有必要的,下面的做法将所有字符判断前先转为大写不如直接用绝对值差32判断简介,同时要注意‘A’-32返回的是int 不是char
public class Solution {
/**
* @param s A string
* @return Whether the string is a valid palindrome
*/
public boolean isPalindrome(String s) {
// Write your code here
if (s.equals(""))
return true;
int i = 0;
int j = s.length()-1;
while (i <= j){
if (s.charAt(i) < '0'||(s.charAt(i) > '9' && s.charAt(i) < 'A') || (s.charAt(i) > 'Z' && s.charAt(i) < 'a')
|| s.charAt(i) > 'z'){
i++;
continue;
}
if (s.charAt(j) < '0'||(s.charAt(j) > '9' && s.charAt(j) < 'A') || (s.charAt(j) > 'Z' && s.charAt(j) < 'a')
|| s.charAt(j) > 'z'){
j--;
continue;
}
int a = s.charAt(i) > 96 ? s.charAt(i) - 32: s.charAt(i);
int b = s.charAt(j) > 96 ? s.charAt(j) - 32: s.charAt(j);
if (a != b)
return false;
else {
i++;
j--;
}
}
return true;
}
}
本文介绍了一种高效的方法来判断给定字符串是否为回文串,通过将字符串转换为字符数组并从两端同时比较元素,从而实现快速判断。讨论了如何忽略大小写和特殊字符,以及使用字符转大写简化比较过程。

被折叠的 条评论
为什么被折叠?



