Skip to main content

Valid Palindrome II

Problem

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

 

Constraints:

  • 1 <= s.length <= 105
  • s consists of lowercase English letters.

Solution

/**
* @param {string} s
* @return {boolean}
*/
var validPalindrome = function(s) {
let l = 0;
let r = s.length - 1;

while (l < r) {
if (s[l] !== s[r]) {
return isPalindrome(s, l + 1, r) || isPalindrome(s, l, r - 1);
}
l++;
r--;
}
return true;
};

var isPalindrome = function(s, l, r) {
while (l < r) {
if (s[l++] !== s[r--]) {
return false;
}
}
return true;
};

We will implement a two pointers solution. We use the standard two pointers method of checking if s is a palindrome (ie. use indices l and r to slide inwards and check if s[l] == s[r]). The only difference is that on the first s[l] and s[r] that is different, we don't immediately terminate. Instead, since we can skip a single letter, we test whether skipping either s[l] or s[r] would give us a valid palindrome.