题目描述
给你一个字符串 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、取或:讨论两种状态下,只要满足一个即可,故用或运算。
函数源码:
cppclass 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; } };