[ 问题: ]
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.
我的解法:
public class Solution {
public boolean isPalindrome(String s) {
if (s == null || s.length() == 0) {
return true;
}
String str = s.toLowerCase();
int start = 0;
int end = str.length() - 1;
while (start <= end) {
while (!Character.isLetterOrDigit(str.charAt(start))) {
if (start < str.length() - 1){
start ++;
} else {
return true;
}
}
while (!Character.isLetterOrDigit(str.charAt(end))) {
if (end > 0) {
end --;
} else {
return true;
}
}
if (str.charAt(start) == str.charAt(end)) {
start ++;
end --;
} else {
return false;
}
}
return true;
}
}
程序思路:
1、判断string是否为空
2、将string转换成小写,定义双指针
3、如果不是字母和数字且指针没到两端,移动双指针,如果到了两端,也说明之后的字符全不是字母和数字,也返回true
4、比较字符,相同移动双指针,不同则不能构成回文,返回false
5、双指针可以在中间位置停下,如果左substrng=右substring,返回true
更清晰解法:
public class Solution {
public boolean isPalindrome(String s) {
if (s.isEmpty()) {
return true;
}
int head = 0, tail = s.length() - 1;
char cHead, cTail;
while(head <= tail) {
cHead = s.charAt(head);
cTail = s.charAt(tail);
if (!Character.isLetterOrDigit(cHead)) {
head++;
} else if(!Character.isLetterOrDigit(cTail)) {
tail--;
} else {
if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) {
return false;
}
head++;
tail--;
}
}
return true;
}
}
采用逐个对比方式,不会出现while寻找下一个符合要求的字符时,一直加到指针越界的问题,可以不判断边界。
采用if elseif else方式,如果不符合要求,则不进行对比,巧妙可取。