12月31日每日一题 leetcode680 验证回文字符串 Ⅱ

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

示例 1:

输入: s = "aba"
输出: true
示例 2:

输入: s = "abca"
输出: true
解释: 你可以删除c字符。
示例 3:

输入: s = "abc"
输出: false

提示:

1 <= s.length <= 105
s 由小写英文字母组成

验证字符串为回文字符串,就是要判断第一个和最后一个,第二个和倒二个......直到中间字符相同,可以想到用双指针逐个比较,题中多了一个条件,可以删除一个字符,如果删除后是一个回文字符串,则也返回true。我们可以先通过双指针进行判断,如果左右对称字符的一直相同,则直接返回true,如果出现不相同,则要判断删除左面这个字符或者删除右面这个字符剩下的字符串是否是回文字符串。假设在第i个和第j个时两字符不同,在i之前和j之后的字符是对称的,近似成一个回文字符串,所以只需要判断i+1到j或者i到j+1中字符串是否为回文字符串,如果是则返回true。(参考力扣题解)

​
class Solution {
    public boolean palindrome(String s,int i,int j){//判断i到j之间字符串是否是回文字符串
        for (;i < j;i++,j--){
            if (s.charAt(i) != s.charAt(j)){//如果两边字符串不同则不是回文字符串,返回false
                return false;
            }
        }
        return true;//如果是回文字符串返回true
    }
    public boolean validPalindrome(String s){
        int left = 0;
        int right = s.length() - 1;//双指针
        while(left < right){
            if (s.charAt(left) == s.charAt(right)){//先起时和末尾开始判断,
                left++;                             //如果相同则继续往中间移动
                right--;                            
            }else{                                  //如果不相同则判断删除左端字符或者右端字
                                                    //符后剩余的字符串是否为回文字符串
                return palindrome(s,left + 1,right) || palindrome(s,left,right - 1);
            }
        }
        return true;//整个字符串本身就是一个回文字符串

    }
}

​

 12月31日每日一题 leetcode680 验证回文字符串 Ⅱ_第1张图片

你可能感兴趣的:(蓝桥杯,html,android)