LeetCode——第125题:验证回文字符串

题目:

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:

本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:

输入: “race a car”
输出: false

代码:
package leetCode;
/**
 * 2018.7.21
 *验证回文字符串
 * @author dhc
 *
 */
public class OneHunderdAndTwentyFive {
    //先提取出只包含字母和数字的字符串,利用reverse函数判断
    public static boolean isPalindrome(String s) {
        if(s == null) {
            return true;
        }
        char[] str = new char[s.length()];
        int index = 0;

        for(int i = 0;i < s.length();i++) {
            if(( s.charAt(i) >= '0' && s.charAt(i) <= '9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') ||(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z')) {
                str[index++] = s.charAt(i);
            }
        }
        String st = new String(str).trim().toLowerCase();
        StringBuffer sb = new StringBuffer(st);
        //下面这一步的反转直接让sb的内容反转了(搞了半天才明白),StringBuffer没有重写equals方法,比较 的是地址,因此转为String比较
        String st1 = sb.reverse().toString();
        if(st.equals(st1)) {
            return true;
        }
        return false;
    }
    //双指针方法,利用两个指针分别从前往后和从后往前,依次判断   6ms
    public static boolean isPalindrome1(String s) {
        if(s == null) {
            return true;
        }
        int l = 0;
        int r = s.length() - 1;
        char lchar = ' ';
        char rchar = ' ';
        while(l < r) {
            //从前往后找到一个有效字符
            while(l < r) {
                if(( s.charAt(l) >= '0' && s.charAt(l) <= '9') || (s.charAt(l) >= 'a' && s.charAt(l) <= 'z')) {
                    lchar = s.charAt(l);
                    l++;
                    break;
                }
                //大写字母转小写
                if((s.charAt(l) >= 'A' && s.charAt(l) <= 'Z')) {
                    lchar = (char) (s.charAt(l) - 'A' + 'a');
                    l++;
                    break;
                }
                l++;
            }
            //从后往前找到一个有效字符
            while(r > l) {
                if(( s.charAt(r) >= '0' && s.charAt(r) <= '9') || (s.charAt(r) >= 'a' && s.charAt(r) <= 'z')) {
                    rchar = s.charAt(r);
                    r--;
                    break;
                }
                //大写字母转小写
                if((s.charAt(r) >= 'A' && s.charAt(r) <= 'Z')) {
                    rchar = (char) (s.charAt(r) - 'A' + 'a');
                    r--;
                    break;
                }
                r--;
            }
            if(lchar != rchar) {
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {
        String str = "aaA";
        System.out.println(isPalindrome1(str));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值