验证回文串
1.问题描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
2.求解
筛选+双指针
代码如下
/*
执行用时:3 ms, 在所有 Java 提交中击败了93.67% 的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了75.06% 的用户
*/
public boolean isPalindrome(String s) {
if(" ".equals(s)){
return true;
}
List<Character> list = new ArrayList<>();
char[] str = s.toCharArray();
for(char c : str){
if(c >= '0' && c <= '9'){
list.add(c);
}
if(c >= 'A' && c <= 'Z'){
list.add((char)(c + 32));
}
if(c >= 'a' && c <= 'z'){
list.add(c);
}
}
int i = 0, j = list.size() - 1;
while(i < j){
if(list.get(i) != list.get(j)){
return false;
}
i++;
j--;
}
return true;
}
ps:java中的Character类有个isLetterOrDigit方法,将对字母和数字字符返回true
使用它可以替代冗长的ASCII判断,可将原答案改为如下:
for(char c : str){
if(Character.isLetterOrDigit(c)){
list.add(Character.toLowerCase(c));
}
}
筛选+翻转
代码如下
/*
执行用时:5 ms, 在所有 Java 提交中击败了49.48% 的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了84.90% 的用户
*/
public boolean isPalindrome(String s) {
if(" ".equals(s)){
return true;
}
StringBuilder res = new StringBuilder();
char[] str = s.toCharArray();
for(char c : str){
if(Character.isLetterOrDigit(c)){
res.append(Character.toLowerCase(c));
}
}
StringBuilder res_rev = new StringBuilder(res).reverse();
return res.toString().equals(res_rev.toString());
}
双指针
代码如下
/*
执行用时:3 ms, 在所有 Java 提交中击败了93.67% 的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了71.16% 的用户
*/
public boolean isPalindrome(String s) {
if(" ".equals(s)){
return true;
}
char[] str = s.toCharArray();
int i = 0, j = str.length - 1;
while(i < j){
while(i < j && !Character.isLetterOrDigit(str[i])){
i++;
}
while(i < j && !Character.isLetterOrDigit(str[j])){
j--;
}
if(Character.toLowerCase(str[i]) != Character.toLowerCase(str[j])){
return false;
}
i++;
j--;
}
return true;
}

浙公网安备 33010602011771号