【每日一题】验证回文串

题目

在这里插入图片描述

示例

在这里插入图片描述

解法一:

利用正则表达式判断每个字符是否为字母或者数字,然后利用stringbuild进行拼接字母或者数字;

 StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            //时字母和数字就拼接到string builder
            if (Character.isLetterOrDigit(s.charAt(i))) {
                sb.append(s.charAt(i));
            }
        }

然后转换为字符串,建立双指针,一个指向末尾,一个指向开头,从两边向中间进行比较,如果不相等,就返回false,否则最后返回true;

  s = sb.toString();
        int i = 0;
        int index = s.length() - 1;
        
     //进行判断
        while (i < index) {
            if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
                return false;
            }
            i++;
            index--;
        }

        return true;

当然也可以直接使用string builder的reverse方法反转,然后进行比较

完整代码:

 public static boolean isPalindrome1(String s) {
//        if (s.length()==1){
//            return true;
//        }
//用string builder来将起来非字母和数字全部去掉
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            //时字母和数字就拼接到string builder
            if (Character.isLetterOrDigit(s.charAt(i))) {
                sb.append(s.charAt(i));
            }
        }

        s = sb.toString();
        int i = 0;
        int index = s.length() - 1;

     //进行判断
        while (i < index) {
            if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
                return false;
            }
            i++;
            index--;
        }

        return true;
    }

解法二

直接建立双指针,left和right,从两边遇到符合条件的字符在停下比较,否则移动寻找,当left大于右指针的时候,退出。进行比较。

完整代码:

public static boolean isPalindrome2(String s) {

        int i = 0;
        int index = s.length() - 1;
        //两个指针相遇就退出
        while (i < index) {
            //从左往右找到数组或者字母,这里判断是否相遇的原因是,有可能一直没有找到可能发生越界
            while (i < index && !Character.isLetterOrDigit(s.charAt(i))) {
                i++;
            }
            //同理从右往左找
            while (i < index && !Character.isLetterOrDigit(s.charAt(index))) {
                index--;
            }

            //进行比较,如果不相等,返回false
            if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
                return false;
            }

            i++;
            index--;
        }

        return true;
    }

解法三—替换掉所有不符合条件的字符

利用字符串方法replaceAll将所有部分和条件的字符替换为""。然后在建立双指针对从两头开始进行比较。

  public static boolean isPalindrome5(String s) {

        //将不符合条件的字符进行替换
        s = s.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
        //遍历比较
        int left = 0;
        int right = s.length() - 1;
        char[] chs = s.toCharArray();
        while (left < right) {
            if (chs[left] != chs[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vivien_o.O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值