leetcode-125-验证回文串(valid palindrome)-java

题目及用例

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值