题目描述
最多删除一个字符得到回文
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
输入: s = "aba"
输出: true
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
输入: s = "abc"
输出: false
提示:
- 1 <= s.length <= 105
- s 由小写英文字母组成
解题思路
最多删除一个字符,这要考虑两种情况,
一是删除左失配字符,二是删除右失配字符
因此要给两次机会实现代码
public boolean validPalindrome(String s) {
int count = 2;
// 双指针
int i = 0;
int j = s.length() - 1;
// 记忆i,j失配的位置,便于回溯
int memi = 0;
int memj = 0;
while (i < j) {
if (s.charAt(i) != s.charAt(j)) {
if (count == 2) {
// 先尝试删除左边
count--;
memi = i++;
memj = j;
continue;
}else if (count == 1) {
// 尝试删除右边
count--;
i = memi;
j = --memj;
continue;
}else {
return false;
}
}
i++;
j--;
}
return true;
}
时间及空间复杂度分析
时间O(n)
空间O(1)拓展思路