680. 验证回文字符串 Ⅱ

题目链接

来源:力扣(LeetCode)

链接:​​https://leetcode-cn.com/problems/valid-palindrome-ii​

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

输入: s = "aba"
输出: true


示例 2:

输入: s = "abca"
输出: true
解释: 你可以删除c字符。


示例 3:

输入: s = "abc"
输出: false


提示:

  • 1 <= s.length <= 105
  • s 由小写英文字母组成

题目分析

  1. 根据题目描述判断一个字符串最多删除一个字符的情况下是否可以构成回文串
  2. 双指针left=0,right=s.length(),从两侧判断字符是否相等
  3. 当s[left]!=s[right]时,要删除left或right位置的字符(此时需要left++或right--),再判断left和right中间的字串是否构成回文串

代码

class Solution {
public:
bool validPalindrome(string s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return check(s, left, right - 1) || check(s, left + 1, right);
} else {
++left;
--right;
}
}
return true;
}

private:
bool check(std::string& s, int left, int right) {
while (left < right) {
if (s[left++] != s[right--]) { return false; }
}
return true;
}
};