题目描述:
给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
提示:
- 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
题目分析:
采用双指针思想,首指针指向字符串开头第一个元素,尾指针指向字符串最后一个元素,两个指针分别向中间靠拢,检查两个指针指向的位置上的字符是否相同,如果相同则构成回文。在字符不同的情况下,分别检查去掉首指针指向的字符和去掉尾指针指向的字符时是否还能构成回文,如果去掉其中一个字符能构成回文,则符合题意,返回true。否则返回false即可。
题解:
执行用时: 10 ms
内存消耗: 39.1 MB
class Solution {
public boolean validPalindrome(String s) {
// 定义双指针分别指向字符串的头尾
int start = 0, end = s.length() - 1;
// 当首指针没有越过尾指针时执行循环
while (start < end) {
// 如果首尾指针指向的位置上的字母不一致
if (s.charAt(start) != s.charAt(end)) {
// 调用函数分别判断 删除首指针指向的元素 或者 删除尾指针指向的元素 时是否还是一个回文字符串
return isPalindrome(s, start + 1, end) || isPalindrome(s, start, end - 1);
}
// 如果首尾指针指向的值一致,则检查下一组字母
start++;
end--;
}
// 如果构成回文字符串,则返回true
return true;
}
// 判断子字符串是否构成回文字符串函数
public boolean isPalindrome(String s, int start, int end) {
// 当首指针没有越过尾指针时执行循环
while (start < end) {
// 如果首尾指针指向的位置上的字母不一致
if (s.charAt(start) != s.charAt(end)) {
// 不构成回文字符串,返回false
return false;
}
// 如果首尾指针指向的值一致,则检查下一组字母
start++;
end--;
}
// 如果构成回文字符串,则返回true
return true;
}
}
题目来源:力扣(LeetCode)