Valid Palindrome II

easy two pointers string greedy

Problem

Given a string s, return true if s can be a palindrome after deleting at most one character from it.

Inputs = "abca"
Outputtrue
Removing 'c' leaves "aba", a palindrome.

def valid_palindrome(s):
    def is_pal(i, j):
        while i < j:
            if s[i] != s[j]: return False
            i += 1; j -= 1
        return True
    i, j = 0, len(s) - 1
    while i < j:
        if s[i] != s[j]:
            return is_pal(i + 1, j) or is_pal(i, j - 1)
        i += 1; j -= 1
    return True
function validPalindrome(s) {
  function isPal(i, j) {
    while (i < j) { if (s[i] !== s[j]) return false; i++; j--; }
    return true;
  }
  let i = 0, j = s.length - 1;
  while (i < j) {
    if (s[i] !== s[j]) return isPal(i + 1, j) || isPal(i, j - 1);
    i++; j--;
  }
  return true;
}
class Solution {
    public boolean validPalindrome(String s) {
        int i = 0, j = s.length() - 1;
        while (i < j) {
            if (s.charAt(i) != s.charAt(j)) return isPal(s, i + 1, j) || isPal(s, i, j - 1);
            i++; j--;
        }
        return true;
    }
    boolean isPal(String s, int i, int j) {
        while (i < j) { if (s.charAt(i) != s.charAt(j)) return false; i++; j--; }
        return true;
    }
}
bool isPal(const string& s, int i, int j) {
    while (i < j) { if (s[i] != s[j]) return false; i++; j--; }
    return true;
}
bool validPalindrome(string s) {
    int i = 0, j = s.size() - 1;
    while (i < j) {
        if (s[i] != s[j]) return isPal(s, i + 1, j) || isPal(s, i, j - 1);
        i++; j--;
    }
    return true;
}
Time: O(n) Space: O(1)