Valid Palindrome Ii
// https://leetcode.com/problems/valid-palindrome-ii/
/*
Given a string s, return true if the s can be palindrome after deleting at most one character from it.
Example 1:
Input: s = "aba"
Output: true
Example 2:
Input: s = "abca"
Output: true
Explanation: You could delete the character 'c'.
Example 3:
Input: s = "abc"
Output: false
*/
#include <string>
#include <iostream>
#include <cassert>
using namespace std;
// Time: O(n), Space: O(1)
bool isValid(string s, int left, int right) {
while (left < right) {
if (s[left] != s[right]) return false;
left++, right--;
}
return true;
}
bool validPalindrome(string s) {
if (s.empty()) {
return true;
}
int l = 0, r = s.size()-1;
while (l < r) {
if (s[l] != s[r]) {
return isValid(s, l+1, r) || isValid(s, l, r-1);
}
l++, r--;
}
return true;
}
bool helper(string s, bool modified) {
if (s.empty()) return true;
int l = 0, r = s.size() - 1;
while (l < r) {
if (s[l] != s[r]) {
string s1 = s.substr(0, l) + s.substr(l + 1);
string s2 = s.substr(0, r) + s.substr(r + 1);
return !modified && (helper(s1, true) || helper(s2, true));
}
l++;
r--;
}
return true;
}
// cbbcc
// bool validPalindrome(string s) {
// return helper(s, false);
// }
int main() {
assert(validPalindrome("aba"));
assert(validPalindrome("abca"));
assert(!validPalindrome("abc"));
assert(validPalindrome("cbbcc"));
return 0;
}```
Last updated