Valid Palindrome II
Return true if the string can become a palindrome after deleting at most one character. Two pointers with a single-skip check.
Sample input
abca
Sample output
true
Solution
def valid_palindrome(s):
def is_pal(lo, hi):
while lo < hi:
if s[lo] != s[hi]:
return False
lo += 1
hi -= 1
return True
lo, hi = 0, len(s) - 1
while lo < hi:
if s[lo] != s[hi]:
return is_pal(lo + 1, hi) or is_pal(lo, hi - 1)
lo += 1
hi -= 1
return True
print(valid_palindrome("abca"))
function validPalindrome(s) {
const isPal = (lo, hi) => {
while (lo < hi) {
if (s[lo] !== s[hi]) return false;
lo++;
hi--;
}
return true;
};
let lo = 0, hi = s.length - 1;
while (lo < hi) {
if (s[lo] !== s[hi]) {
return isPal(lo + 1, hi) || isPal(lo, hi - 1);
}
lo++;
hi--;
}
return true;
}
console.log(validPalindrome("abca"));
public class Main {
static boolean isPal(String s, int lo, int hi) {
while (lo < hi) {
if (s.charAt(lo) != s.charAt(hi)) return false;
lo++;
hi--;
}
return true;
}
static boolean validPalindrome(String s) {
int lo = 0, hi = s.length() - 1;
while (lo < hi) {
if (s.charAt(lo) != s.charAt(hi)) {
return isPal(s, lo + 1, hi) || isPal(s, lo, hi - 1);
}
lo++;
hi--;
}
return true;
}
public static void main(String[] args) {
System.out.println(validPalindrome("abca"));
}
}
fun isPal(s: String, start: Int, end: Int): Boolean {
var lo = start
var hi = end
while (lo < hi) {
if (s[lo] != s[hi]) return false
lo++
hi--
}
return true
}
fun validPalindrome(s: String): Boolean {
var lo = 0
var hi = s.length - 1
while (lo < hi) {
if (s[lo] != s[hi]) {
return isPal(s, lo + 1, hi) || isPal(s, lo, hi - 1)
}
lo++
hi--
}
return true
}
fun main() {
println(validPalindrome("abca"))
}
func isPal(_ chars: [Character], _ start: Int, _ end: Int) -> Bool {
var lo = start, hi = end
while lo < hi {
if chars[lo] != chars[hi] { return false }
lo += 1
hi -= 1
}
return true
}
func validPalindrome(_ s: String) -> Bool {
let chars = Array(s)
var lo = 0, hi = chars.count - 1
while lo < hi {
if chars[lo] != chars[hi] {
return isPal(chars, lo + 1, hi) || isPal(chars, lo, hi - 1)
}
lo += 1
hi -= 1
}
return true
}
print(validPalindrome("abca"))
bool isPal(String s, int lo, int hi) {
while (lo < hi) {
if (s[lo] != s[hi]) return false;
lo++;
hi--;
}
return true;
}
bool validPalindrome(String s) {
int lo = 0, hi = s.length - 1;
while (lo < hi) {
if (s[lo] != s[hi]) {
return isPal(s, lo + 1, hi) || isPal(s, lo, hi - 1);
}
lo++;
hi--;
}
return true;
}
void main() {
print(validPalindrome('abca'));
}
#include <iostream>
#include <string>
using namespace std;
bool isPal(const string& s, int lo, int hi) {
while (lo < hi) {
if (s[lo] != s[hi]) return false;
lo++;
hi--;
}
return true;
}
bool validPalindrome(const string& s) {
int lo = 0, hi = s.size() - 1;
while (lo < hi) {
if (s[lo] != s[hi]) {
return isPal(s, lo + 1, hi) || isPal(s, lo, hi - 1);
}
lo++;
hi--;
}
return true;
}
int main() {
cout << (validPalindrome("abca") ? "true" : "false") << endl;
return 0;
}
#include <stdio.h>
#include <string.h>
int isPal(const char *s, int lo, int hi) {
while (lo < hi) {
if (s[lo] != s[hi]) return 0;
lo++;
hi--;
}
return 1;
}
int validPalindrome(const char *s) {
int lo = 0, hi = strlen(s) - 1;
while (lo < hi) {
if (s[lo] != s[hi]) {
return isPal(s, lo + 1, hi) || isPal(s, lo, hi - 1);
}
lo++;
hi--;
}
return 1;
}
int main() {
printf("%s\n", validPalindrome("abca") ? "true" : "false");
return 0;
}