leetcode680. 验证回文字符串 Ⅱ(java)

​

public static boolean validPalindrome(String s) {
    if (s.length() <= 2) {//如果字符串长度小于等于2,直接返回true
        return true;
    }
    return checkResult(s, 0, s.length() - 1, 1);
}

private static Boolean checkResult(String s, int l, int r, int count) {
    char[] chars = s.toCharArray();
    while (l <= r - 1) {
        if (chars[l] != chars[r]) {
            if (count <= 0) {
                return false;
            }
            return checkResult(s, l + 1, r, count - 1) || checkResult(s, l, r - 1, count - 1);
        }
        l++;
        r--;
    }
    return true;
}

​
  1. ​首先判断字符串的长度是否小于等于2,如果符合,不论传递过来的字符是什么,都是回文字符串,返回true

  2. 进入正题,开始检查字符串,此时需要的参数为s(要验证字符串),l(一个左指针,传0),r(一个右指针,传递字符串的长度减一,因为后面的检查是从0开始,而不是从1开始,如果不进行减一操作,会造成角标越界),count(一个计数单位,传1)这四个值:

  •  2.1将字符s通过java本身的方法toCharArray转换成Char类型的数组chars,在接下来的操作中会使用

  •   2.2创建一个while循环,循环的条件是l(左指针)小于等于r-1(右指针)。这里之所以会减一,是因为如果右指针不进行减一操作,会出现l=r(左指针等于右指针)的情况,也就是重复验证,所以这里必须对右指针进行减一操作。
  •  2.3while循环中判断chars数组中左指针chars[l]是否和右指针chars[r]相等,如果相等不做操作。如果不相等就继续判断count是否小于等于0。如果满足条件,返回false。如果不满足条件,就使用递归操作,返回checkResult(s, l + 1, r, count - 1) || checkResult(s, l, r - 1, count - 1);
  •  2.4如果chars的左右指针指向的字符相等,就进行l++(左指针递增)r--(右指针递减)操作
  • 2.5如果上面的判断都没有进行,最终chechResult方法返回true.

难点
递归方法一开始看的不是很明白,不知道为什么要count-1,最终想明白了,关键在于符号||,如果字符串是回文字符串的话,就会直接走到方法最后的true,这个不用解释;当不是回文字符串时,由于题目要最多删除一个字符,所以这里要用||这个符号来递归调用,因为符号或(||)的规则是只有两个都是flase的时候才会是false,也就是说当左指针减一和右指针减一返回的值同时为false的时候,才会返回false,这样就完美的满足了最多删除一个字符的条件。只要明白这个关键点,你就会发现整体代码很简单。

ps: char[] chars = s.toCharArray(),这行代码必须写,然后在判断中使用chars[l]!=chars[r],千万不要为了少写代码而写成s.toCharArray()[l]!=s.toCharArray()[r],如果这样写,会增加时间复杂度,非常耗资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值