Leetcode 680 验证回文字符串 Ⅱ && 剑指 Offer II 019 最多删除一个字符得到回文

680. 验证回文字符串 Ⅱ

剑指 Offer II 019. 最多删除一个字符得到回文

题意:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

解题思路

解法:
1.双指针方法,去判断回文字符串
2.如果采用每次遍历、删除,然后再判断是否为回文字符串,时间复杂度是O(n^2),必然会超时,所以我们这时需要去找一下规律
3.双指针从两边往中间遍历的时候,当遇到left和right字符不等时,这时只需去判断[left,right)或者(left,right]内的字符是否满足回文字符串,所以代码就很清晰了,就是把第一个for循环,改为while双指针判断

解题遇到的问题

一个小坑.png

编码过程中,把此处代码写成了l++/r--或者--l/--r导致结果出错,实际上++、--操作是针对于变量本身的操作,相当于i=i+1、i=i-1,会改变原先变量的值,而我们此处只是想将当前l或者r传入函数而已,并未想要改变值

后续需要总结学习的知识点

##解法
class Solution {
    public boolean validPalindrome(String s) {
        if (s.length() == 1) {
            return true;
        }
        int l = 0, r = s.length() - 1;
        while (l < r) {
            if (s.charAt(l) != s.charAt(r)) {
                return isPalindrome(s, l + 1, r) || isPalindrome(s, l, r - 1);
            }
            l++;
            r--;
        }
        return true;
    }

    /**
     * 题意中明确,s由小写字母组成
     */
    public boolean isPalindrome(String s, int l, int r) {
        while (l < r) {
            if (s.charAt(l) != s.charAt(r)) {
                return false;
            }
            l++;
            r--;
        }
        return true;
    }
}

你可能感兴趣的:(Leetcode 680 验证回文字符串 Ⅱ && 剑指 Offer II 019 最多删除一个字符得到回文)