每日算法:680. 验证回文字符串 Ⅱ

237 阅读1分钟

难度:简单

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

解题思路

定义两个指针,指向头尾,遇到不相同的话,则会有三种情况,第一种是移除低位剩余的为回文字符串,第二种是移除高位剩余的为回文字符串,第三种是不符合。

题解

public boolean validPalindrome(String s) {
    int left = 0;
    int right = s.length() - 1;
    char leftChar, rightChar;
    while (left < right) {
        leftChar = s.charAt(left);
        rightChar = s.charAt(right);
        if (leftChar != rightChar) {
            return validPalindrome(s, left + 1, right) || validPalindrome(s, left, right - 1);
        }
        ++left;
        --right;
    }
    return true;
}

private boolean validPalindrome(String s, int left, int right) {
    while (left < right) {
        if (s.charAt(left) == s.charAt(right)) {
            ++left;
            --right;
        } else {
            return false;
        }
    }
    return true;
}

测试

ValidPalindromeII validPalindromeII = new ValidPalindromeII();

@Test
public void test_case1() {
    Assertions.assertTrue(validPalindromeII.validPalindrome("aba"));
}

@Test
public void test_case2() {
    Assertions.assertTrue(validPalindromeII.validPalindrome("abca"));
}

@Test
public void test_case3() {
    Assertions.assertTrue(validPalindromeII.validPalindrome("abbda"));
}

@Test
public void test_case4() {
    Assertions.assertFalse(validPalindromeII.validPalindrome("abc"));
}

@Test
public void test_case5() {
    Assertions.assertTrue(validPalindromeII.validPalindrome("ebcbbececabbacecbbcbe"));
}