Valid Palindrome有效回文

刷了几天的题,终于遇上连题目都看不懂的题了,瞬间觉得高大上,果然我们每个人的崇拜感都是来自于对未知区域的盲目崇拜,如果你踏进了那片区域,会发现也不过如此。期待我会有感到“不过如此”的那一天。

Given a string, determine if it is a palindrome, considering onlyalphanumeric characters (字母数字)and ignoring cases(不考虑大小写).

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

public class Solution {
    public boolean isPalindrome(String s) {
        char ch[] = s.toCharArray(); 
         if (ch.length == 0){  //空字符串默认为有效回文
             return true;
         }
        int flag = 1;
        int i = 0;
        int j = ch.length - 1;
        while (flag!=0 && (i < j)){
            if (flag!=0  && (i < j) && ((ch[i] >= '0' && ch[i] <= '9') || (ch[i] >= 'A' && ch[i] <= 'Z') || (ch[i] >= 'a' && ch[i] <='z'))){
                if (flag!=0  && (i < j)&& ((ch[j] >= '0' && ch[j] <= '9') || (ch[j] >= 'A' && ch[j] <= 'Z') || (ch[j] >= 'a' && ch[j] <='z'))){
                    if(((ch[i] != ch[j]) &&Math.abs((int)(ch[i] - ch[j])) != 32) || (j - i <= 2)){
                        flag = 0;
                        break;
                    }
                    else{
                        i ++;
                        j --;
                    }
                }
                else{
                    j --; 
                }
            }
            else{
                i ++;  
            }
        }
        if ((j - i <= 2) && ((ch[i] == ch[j]) ||Math.abs((int)(ch[i] - ch[j])) == 32)){
            return true;
        }
        else{
            return false;
        }
    }
}
这里需要注意的是,对于给定的String类型s变量,不能直接使用是s[i]寻找字符,会提示" array required, but String found"错误,也就是说,对String字符串不能这样操作,但是对Array数组可以,所以根据错误提示先将字符串转化为数组。

用到Math.abs也是由于错误提示, ignoring cases(不考虑大小写),所以增加了一个判断。
说实话,如果这道题没有更简便的解法的话,我会觉得题目出得没什么意义,无非就是了解了一下回文的意义,写几个循环判断一下当前字符是否是数字和字母,除了一堆冗长的判断,没什么技巧性可言。

接上!去Discuss转转总是有收获的,找到了想要用的判断字母数字的函数

public class Solution {
    public boolean isPalindrome(String s) {
        char ch[] = s.toCharArray();
         if (ch.length == 0){
             return true;
         }
        int flag = 1;
        int i = 0;
        int j = ch.length - 1;
        while (flag!=0 && (i < j)){
            while (flag!=0 && (i < j) && (!Character.isLetterOrDigit(ch[i]))){
                i ++;
            }
            while (flag!=0 && (i < j) && (!Character.isLetterOrDigit(ch[j]))){
                j --;
            }
            if(((ch[i] != ch[j]) && Math.abs((int)(ch[i] - ch[j])) != 32)|| j - i <= 2){
                flag = 0;
                break;
            }
            else{
                i ++;
                j --;
            }
        }
        if ((j - i <= 2) && ((ch[i] == ch[j]) ||Math.abs((int)(ch[i] - ch[j])) == 32)){
            return true;
        }
        else{
            return false;
        }
    }
}
前面之所以说这题没什么技巧性,实在是因为被那一大堆大于小于搞烦了,写的过程中我真的有去找判断字符是否为字母数字的函数,但是没找到,我以为真的是没有,结果竟然在Discuss里看到有人用了嘿嘿,就是Character.isLetterOrDigit( )啦,只需要当前字符作为参数即可。真心佩服这些善用类方法的人呐,可以省去多少事啊~~

除此之外,我还发现了一个不完美的代码但是很值得学习的想法!!

public class Solution {
    public boolean isPalindrome(String s) {
        boolean flag = true;
        String str = s.toLowerCase().replaceAll("[^a-z0-9]","");
        for(int i=0; i<str.length()/2; i++){
            if(str.charAt(i) != str.charAt(str.length()-1-i)){
                flag = false;
           <span style="white-space:pre">	</span>break;//!!!
            }
        }
        return flag;
    }
}
为什么说idea is good 呢?因为这位同学很机智地在一开始就把所有字符转化成了不会影响结果的最方便判断的形式:所有非字母数字的字符都变为""(不要以为是空格,其实是没了),还有大写字母都变成了小写的,然后一个循环直接搞定判断。 这里的break是我加上去的,因为一旦发现有不同就应该直接跳出并return false,这样就省去了后面的无用功比较。赞!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值