151
社区成员
发帖
与我相关
我的任务
分享给你一个字符串 s,最多可以从中删除一个字符。请你判断 s 是否能成为回文字符串:如果能,返回 true;否则返回 false。
表格
| 输入 | 输出 | 说明 |
|---|---|---|
"aba" | true | 本身就是回文,无需删除 |
"abca" | true | 删除字符c即可变成回文 |
"abc" | false | 删除任意一个都不是回文 |
数据范围:字符串长度 1≤n≤105,必须用 O (n) 时间复杂度解法
本题是经典双指针进阶回文问题,普通回文串是左右指针相等就移动,本题多了一个「最多删 1 个字符」的条件:
left从头部开始,右指针right从尾部开始s[left] == s[right]:左右指针同时向内移动s[left] != s[right]:出现不匹配,此时有两种贪心选择:
[left+1, right] 是否是回文[left, right-1] 是否是回文true;都不是返回false优势:一次遍历 + 最多两次子串检查,整体时间复杂度 O (n),完全满足 1e5 长度数据要求
java
运行
class Solution {
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 checkPalindrome(s, left + 1, right)
|| checkPalindrome(s, left, right - 1);
}
}
// 循环结束说明本身就是回文,无需删除
return true;
}
/**
* 辅助函数:判断字符串s [l,r]区间内是否是严格回文串(不能删除字符)
*/
private boolean checkPalindrome(String s, int l, int r) {
while (l < r) {
if (s.charAt(l) != s.charAt(r)) {
return false;
}
l++;
r--;
}
return true;
}
}
java
运行
validPalindrome("aba") // true 本身回文
validPalindrome("abca") // true 删除c
validPalindrome("abc") // false 无法满足
validPalindrome("a") // true 单个字符
validPalindrome("cuucu") // true 删除中间u
本题是双指针算法入门经典题,区别于基础回文串判断,重点考察:
非常适合力扣新手入门双指针、字符串算法,也是面试高频手写简单题。