leetcode 680. 验证回文字符串 Ⅱ
题目详情
题目链接
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
- 示例 1:
输入: “aba”
输出: True- 示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。- 注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
我的代码
class Solution {
public:
bool isPalindromeNumber(const string &s, int start, int end) {
while (start < end) {
if (s[start] != s[end]) {
return false;
}
++start, --end;
}
return true;
}
bool validPalindrome(string s) {
int len = s.size();
if (len < 3) {
return true;
}
int start = 0, end = len - 1;
while (start < end) {
if (s[start] != s[end]) {
break;
}
++start, --end;
}
if (start >= end) {
return true;
}
return start >= end? true: isPalindromeNumber(s, start + 1, end)
|| isPalindromeNumber(s, start, end - 1);
}
};
我的成绩
执行结果:通过
执行用时 : 88 ms, 在所有 C++ 提交中击败了54.24%的用户
内存消耗 : 19.8 MB, 在所有 C++ 提交中击败了100.00%的用户
一些想法
本道题我的想法是先找到使得字符串不是回文字符串的位置,然后跳过这个位置,继续判断。
执行用时为 12 ms 的范例
static int n=[](){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);return 0;}();
class Solution {
public:
bool validPalindromeCore(string& s, int start, int end) {
while (start < end) {
if (s[start++] != s[end--]) return false;
}
return true;
}
bool validPalindrome(string s) {
if (s.size() <= 2) return true;
//移除首位相同的,s[start]==s[end]时,只需要判断s[start+1,...,end-1]
int start = 0, end = s.size() - 1;
while (start < end) {
if (s[start] != s[end]) break;
++ start;
-- end;
}
return validPalindromeCore(s, start, end - 1) || validPalindromeCore(s, start + 1, end);
}
};
思考
范例做法好像和我一样,为司马时间差这么多。。。