题目及用例
package pid125;
/*验证回文字符串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
*/
public class main {
public static void main(String[] args) {
String [] testTable = {"helleh","a man, a plan, a canal: Panama","race a car"};
for (String ito : testTable) {
test(ito);
}
}
private static void test(String ito) {
Solution solution = new Solution();
Boolean rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.isPalindrome(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法一(成功,10ms,很快)
双指针,从字符串两边开始寻找小数字母,数字,找到后检查i是否大于等于j,如果是,则说明超出边界,可以返回true
然后将字母将转为小写字母,检验是否相等,如果是,则i++,j–。
public boolean isPalindrome(String s) {
int length=s.length();
if(length==0){
return true;
}
int i=0;
int j=length-1;
while(true){
while(i<length){
if(isCorrectCharacter(s, i)){
break;
}
i++;
}
while(j>=0){
if(isCorrectCharacter(s, j)){
break;
}
j--;
}
if(i>=j){
break;
}
if(Character.toLowerCase(s.charAt(i))==Character.toLowerCase(s.charAt(j))){
i++;
j--;
}
else{
return false;
}
}
return true;
}
public boolean isCorrectCharacter(String s,int index){
char now=s.charAt(index);
if(now>='0'&&now<='9'){
return true;
}
if(now>='a'&&now<='z'){
return true;
}
if(now>='A'&&now<='Z'){
return true;
}
return false;
}
别人的解法基本一样,但有一点改进
基本思路一样
while循环里的逻辑分3步
1 前置i固定字符
2 后置j固定字符3 然后比较这两个位置的值是否相同,相同继续处理 i++ j++
这里判断原来是自己的方法,现在直接用库里的方法
3 用到了Character类里的方法
1 判断是否是数字和英文字符 . Character.isLetterOrDigit
2 字母的小写化 Characte.toLowerCase
class Solution {
public boolean isPalindrome(String s) {
int i = 0, j = s.length() - 1;
while(i < j){
while(i < j && !Character.isLetterOrDigit(s.charAt(i))) i++;
while(i < j && !Character.isLetterOrDigit(s.charAt(j))) j--;
if(Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) return false;
i++; j--;
}
return true;
}
}