验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
这个算法,我写的第一遍是39ms, 后来看到别人的优化点,写到了4-6ms
算法是一个不断优化的过程,也是一个不断学习进步的过程。算法是一个很好玩的过程。
第一遍:
class Solution {
public boolean isPalindrome(String s) {
String string = s.replaceAll(" ", "");
int length = string.length();
if (length == 0 || length == 1) {
return true;
}
for (int i = 0,j =length-1; j > 0 && j>i;) {
char headChar = string.charAt(i);
if (!Character.isDigit(headChar) && !Character.isAlphabetic(headChar)) {
i++;
continue;
}
char endChar = string.charAt(j);
if (!Character.isDigit(endChar) && !Character.isAlphabetic(endChar)) {
j--;
continue;
}
if (headChar != endChar && (Character.isLowerCase(headChar)? Character.toUpperCase(headChar) : Character.toLowerCase(headChar)) != endChar) {
return false;
}else {
i++;
j--;
}
}
return true;
}
}
第四遍:
public static boolean isPalindrome(String s) {
int length = s.length();
if (length == 0 || length == 1) {
return true;
}
for (int i = 0,j =length-1; j>i;) {
char headChar = s.charAt(i);
if (headChar >= 'A' && headChar<= 'Z'){//抓换成小写
headChar +=32;
}else if (! ((headChar >= 'a' && headChar<= 'z') || (headChar >= '0' && headChar<='9'))){
i++;
continue;
}
char endChar = s.charAt(j);
if (endChar >= 'A' && endChar<= 'Z'){//抓换成小写
endChar +=32;
}else if (! ((endChar >= 'a' && endChar<= 'z') || (endChar >= '0' && endChar<='9'))){
j--;
continue;
}
if (headChar != endChar ) {
return false;
}else {
i++;
j--;
}
}
return true;
}
网上最优的算:
class Solution {
public boolean isPalindrome(String s) {
if(s == null || s.length() == 0){
return true;
}
char[] copy = s.toCharArray();
char[] letterAndNums = new char[copy.length];
int index = 0;
for(int i = 0; i < copy.length; i++){
if((copy[i] >= 'a' && copy[i] <= 'z')||(copy[i] >= '0' && copy[i] <= '9')){
letterAndNums[index++] = copy[i];
}else if((copy[i] >= 'A' && copy[i] <= 'Z')){
letterAndNums[index++] = (char)(copy[i] + 32);
}
}
letterAndNums = Arrays.copyOfRange(letterAndNums, 0, index);
int start = 0, end = letterAndNums.length - 1;
while(start < end){
if(letterAndNums[start++] != letterAndNums[end--]){
return false;
}
}
return true;
}
}
加油!