题目: 给定一个非空字符串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),只需要维护有限的常量空间;