day49—双指针+贪心—验证回文串(LeetCode-680)
题目描述
给你一个字符串 s
,最多 可以从中删除一个字符。
请你判断 s
是否能成为回文字符串:如果能,返回 true
;否则,返回 false
。
示例 1:
输入:s = "aba" 输出:true
示例 2:
输入:s = "abca" 输出:true 解释:你可以删除字符 'c' 。
示例 3:
输入:s = "abc" 输出:false
提示:
1 <= s.length <= 105
s
由小写英文字母组成
解决方案:
1、首尾向内收缩遍历:会出现删除左字符还是右字符的问题,解决:先假设删除一边
2、检查函数:检查删除后,剩余的字符是否符合题意
3、取或:讨论两种状态下,只要满足一个即可,故用或运算。
函数源码:
class Solution { public:bool check(const string& s, int l, int r) {for (int i = l, j = r; i < j; i++, j--) {if (s[i] != s[j]) {return false;}}return true;}bool validPalindrome(string s) {int l = 0, r = s.size() - 1;while (l < r) {char c1 = s[l], c2 = s[r];if (c1 == c2) {l++;r--;} else {return check(s, l, r - 1) || check(s, l + 1, r);}}return true;} };