首页 > 技术文章 > leetcode 680. 验证回文字符串 Ⅱ

wangzaiguli 2021-08-26 14:08 原文

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

 

示例 1:

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

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

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

双指针,前后遍历字符串

1:获取长度length,若是长度小于3,则返回true.

2:设置 st 和end 两个变量,从前后开始遍历字符串,若是字符相同,则st++, end--。

3:若是遇到不行同的,则舍弃st,所以st++, 继续遍历。

4:若是再次遇到不相同的,则返回上一次遇到不相同的坐标,这次舍弃后面的, 即end--

5:若是第三次遇到不相同的,则返回false。

6:设置一个flag 来记录是第几次遇到不同字符。

    public boolean validPalindrome(String s) {
        if (s == null) {
            return true;
        }
        int length = s.length();
        if (length < 3) {
            return true;
        }
        int st = 0;
        int end = length - 1;
        int flag = 0;
        int st1 = 0;
        int end1 = 0;
        while (st < end) {
            if (s.charAt(st) == s.charAt(end)) {
                st++;
                end--;
                continue;
            }
            if (flag == 2) {
                return false;
            }
            if (flag == 0) {
                st1 = st;
                end1 = end;
                st++;
            } else {
                st = st1;
                end = end1;
                end--;
            }
            flag++;
        }
        return true;
    }

推荐阅读