验证回文字符串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
import java.util.Set;
import java.util.HashSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Arrays;
import java.lang.String;
class Solution {
/* 定义头尾指针
* 从头尾遍历判断字符是否相等(非数字/字符则跳过)
* 执行用时 15 ms, 在所有 Java 提交中击败了49.52%的用户
* 内存消耗 :36.9 MB, 在所有 Java 提交中击败了96.52%的用户
*/
public static boolean isPalindrome0(String s) {
s=s.toLowerCase();
int startIndex=0;
int endIndex=s.length()-1;
while (startIndex<endIndex&&startIndex<s.length()-1) {
char pre=s.charAt(startIndex);
char aft=s.charAt(endIndex);
if(!((pre>='a'&&pre<='z')||(pre>='0'&&pre<='9'))){
startIndex++;
continue;
}
if(!((aft>='a'&&aft<='z')||(aft>='0'&&aft<='9'))) {
endIndex--;
continue;
}
if(pre!=aft) {
return false;
}
startIndex++;
endIndex--;
}
System.out.println(startIndex);
System.out.println(endIndex);
return true;
}
/*
* 执行用时 :9 ms, 在所有 Java 提交中击败了85.38%的用户
* 内存消耗 :38.2 MB, 在所有 Java 提交中击败了80.51%的用户
*/
public static boolean isPalindrome1(String s) {
if(s.isEmpty())
return true;
int head=0,tail=s.length()-1;
char cHead=s.charAt(head),cTail=s.charAt(tail);
while(head<tail&&head<s.length()-1) {
while(!Character.isLetterOrDigit(cHead)) {
head++;
cHead=s.charAt(head);
if(head>=tail) return true;
}
while(!Character.isLetterOrDigit(cTail)) {
tail--;
cTail=s.charAt(tail);
if(head>=tail) return true;
}
if(Character.toLowerCase(cHead)!=Character.toLowerCase(cTail))
return false;
head++;
cHead=s.charAt(head);
tail--;
cTail=s.charAt(tail);
System.out.println();
}
return true;
}
/*
* 执行用时 :10 ms, 在所有 Java 提交中击败了80.34%的用户
* 内存消耗 :37.8 MB, 在所有 Java 提交中击败了87.31%的用户
*/
public static boolean isPalindrome2(String s) {
if(s.isEmpty())
return true;
int head=0,tail=s.length()-1;
char cHead=Character.toLowerCase(s.charAt(head)),cTail=Character.toLowerCase(s.charAt(tail));
while(head<tail&&head<s.length()-1) {
while(!((cHead>='a'&&cHead<='z')||(cHead>='0'&&cHead<='9'))) {
head++;
cHead=Character.toLowerCase(s.charAt(head));
if(head>=tail) return true;
}
while(!((cTail>='a'&&cTail<='z')||(cTail>='0'&&cTail<='9'))) {
tail--;
cTail=Character.toLowerCase(s.charAt(tail));
if(head>=tail) return true;
}
if(Character.toLowerCase(cHead)!=Character.toLowerCase(cTail))
return false;
head++;
cHead=Character.toLowerCase(s.charAt(head));
tail--;
cTail=Character.toLowerCase(s.charAt(tail));
}
return true;
}
public static void main(String[] args) {
System.out.println(isPalindrome2("0P"));
}
}