给定一个非空字符串 s
,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = "aba" 输出: true
示例 2:
输入: s = "abca" 输出: true 解释: 可以删除 "c" 字符 或者 "b" 字符
示例 3:
输入: s = "abc" 输出: false
提示:
1 <= s.length <= 105
s
由小写英文字母组成
注意:本题与主站 680 题相同: https://leetcode-cn.com/problems/valid-palindrome-ii/
双指针,当 s[i]
不等于 s[j]
时,分别尝试跳过 i
或跳过 j
class Solution:
def validPalindrome(self, s: str) -> bool:
def check(i, j):
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
i, j = 0, len(s) - 1
while i < j:
if s[i] == s[j]:
i += 1
j -= 1
else:
return check(i + 1, j) or check(i, j - 1)
return True
class Solution {
public boolean validPalindrome(String s) {
int i = 0, j = s.length() - 1;
while (i < j) {
if (s.charAt(i) == s.charAt(j)) {
i++;
j--;
} else {
return check(s, i + 1, j) || check(s, i, j - 1);
}
}
return true;
}
private boolean check(String s, int i, int j) {
while (i < j) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
i++;
j--;
}
return true;
}
}
func validPalindrome(s string) bool {
i, j := 0, len(s)-1
for i < j {
if s[i] == s[j] {
i++
j--
} else {
return check(s, i+1, j) || check(s, i, j-1)
}
}
return true
}
func check(s string, i, j int) bool {
for i < j {
if s[i] != s[j] {
return false
}
i++
j--
}
return true
}