题目:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
解法1:反转
/**
* 思路:
* 过滤掉除字母和数字外的字符
* 把所有的字母统一大写或小写
* 反转字符串进行比较
*/
public static boolean isPalindrome(String s) {
String filter=filterString(s);
String trans=transLettre(filter);
return judge(trans);
}
private static boolean judge(String trans) {
String reverse = new StringBuilder(trans).reverse().toString();
return reverse.equals(trans);
}
private static String transLettre(String filter) {
return filter.toLowerCase();
}
private static String filterString(String s) {
return s.replaceAll("[^a-zA-Z0-9]", "");
}
时间复杂度:On
空间复杂度:O1
解法2:双指针
/**
* 思路:
* 过滤掉除字母和数字外的字符
* 把所有的字母统一大写或小写
* 字符串转换为字符数组,首位比较
*/
public static boolean isPalindrome(String s) {
String filter=filterString(s);
String trans=transLettre(filter);
return judge(trans);
}
private static boolean judge(String trans) {
char[] chars = trans.toCharArray();
int head=0,tail=chars.length-1;
while (tail>head){
if (chars[head]!=chars[tail]){
return false;
}
head++;tail--;
}
return true;
}
private static String transLettre(String filter) {
return filter.toLowerCase();
}
private static String filterString(String s) {
return s.replaceAll("[^a-zA-Z0-9]", "");
}
时间复杂度:On
空间复杂度:On