Skip to content

Latest commit

 

History

History
54 lines (54 loc) · 2.03 KB

680.验证回文字符串II(简单).md

File metadata and controls

54 lines (54 loc) · 2.03 KB
题目: 给定一个非空字符串s,最多删除一个字符;判断是否能成为回文字符串;
    输入: "aba"
    输出: True
    输入: "abca"
    输出: True
    解释: 你可以删除c字符
    注意: 字符串只包含从 a-z 的小写字母;字符串的最大长度是50000;
1.双指针+贪心算法
    [1]思路: 
        (1)定义两个指针变量分别指向字符串的第一和最后一个字符;
        (2)遍历字符串,比较指针指向的字符是否相等;
        (3)如果相等,则左指针向右移动,右指针向左移动;
        (4)如果不相等,则分两种情况: 跳过当前左指针进行比较,跳过当前右指针进行比较;
    [2]实现:
        class Solution {
            public static boolean validPalindrome(String s) {
                int i = 0, j = s.length() - 1;
                while (i < j) {
                    char low = s.charAt(i);
                    char high = s.charAt(j);
                    if (low == high) {
                        i++;
                        j--;
                    } else {
                        boolean flag1 = true, flag2 = true;
                        for (int k = i + 1, n = j; k < n; k++, n--) {
                            low = s.charAt(k);
                            high = s.charAt(n);
                            if (low != high) {
                                flag1 = false;
                                break;
                            }
                        }
                        for (int k = i, n = j - 1; k < n; k++, n--) {
                            low = s.charAt(k);
                            high = s.charAt(n);
                            if (low != high) {
                                flag2 = false;
                                break;
                            }
                        }
                        return flag1 || flag2;
                    }
                }
                return true;
            }
        }
    [3]复杂度分析:
        (1)时间复杂度: O(n),其中n是字符串的长度
            判断整个字符串是否是回文字符串的时间复杂度是 O(n);
            遇到不同字符时,判断两个子串是否是回文字符串的时间复杂度也都是 O(n);
        (2)空间复杂度: O(W),只需要维护有限的常量空间;