09 Sept 2026Go / Python / TypeScriptEasy

Valid Palindrome II

Check whether a string can become a palindrome after deleting at most one character.

Move two pointers inward. At the first mismatch, test the two possible single-character skips; no later branching is necessary.

complexity

O(n) time and O(1) extra space.

solution files

  • Go valid-palindrome-ii/solution.go
  • Python valid-palindrome-ii/solution.py
  • TypeScript valid-palindrome-ii/solution.ts

Solution files

Govalid-palindrome-ii/solution.go
package main

func validPalindrome(s string) bool {
	isPalindrome := func(left int, right int) bool {
		for left < right {
			if s[left] != s[right] {
				return false
			}
			left++
			right--
		}
		return true
	}
	left, right := 0, len(s)-1
	for left < right {
		if s[left] != s[right] {
			return isPalindrome(left+1, right) || isPalindrome(left, right-1)
		}
		left++
		right--
	}
	return true
}
Pythonvalid-palindrome-ii/solution.py
class Solution:
    def validPalindrome(self, s: str) -> bool:
        def is_palindrome(left: int, right: int) -> bool:
            while left < right:
                if s[left] != s[right]: return False
                left, right = left + class="syntax-number">1, right - class="syntax-number">1
            return True

        left, right = class="syntax-number">0, len(s) - class="syntax-number">1
        while left < right:
            if s[left] != s[right]:
                return is_palindrome(left + class="syntax-number">1, right) or is_palindrome(left, right - class="syntax-number">1)
            left, right = left + class="syntax-number">1, right - class="syntax-number">1
        return True
TypeScriptvalid-palindrome-ii/solution.ts
function validPalindrome(s: string): boolean {
  const isPalindrome = (left: number, right: number): boolean => {
    while (left < right) { if (s[left] !== s[right]) return false; left += class="syntax-number">1; right -= class="syntax-number">1; }
    return true;
  };
  let left = class="syntax-number">0;
  let right = s.length - class="syntax-number">1;
  while (left < right) {
    if (s[left] !== s[right]) return isPalindrome(left + class="syntax-number">1, right) || isPalindrome(left, right - class="syntax-number">1);
    left += class="syntax-number">1; right -= class="syntax-number">1;
  }
  return true;
}