1. 程式人生 > 其它 >中判斷迴文的程式碼_680. 驗證迴文字串 Ⅱ

中判斷迴文的程式碼_680. 驗證迴文字串 Ⅱ

技術標籤:中判斷迴文的程式碼

ce17b14f2003ed7657b0e5089fb58f68.png

680. 驗證迴文字串 Ⅱ

給定一個非空字串 s最多刪除一個字元。判斷是否能成為迴文字串。

示例1:

輸入: "aba"
輸出: True

示例2:

輸入: "abca"
輸出: True
解釋: 你可以刪除c字元。

注意:

  1. 字串只包含從 a-z的小寫字母。字串的最大長度是50000

題解:

本題和125. 驗證迴文串很像,除去了標點符號和大小寫,但是增加了可以刪除一個元素的條件。我們還是建立雙指標,這裡我們選擇將字串s轉換為char[]陣列,這樣能夠提高速度。left指標向前遍歷,right指標向後遍歷,因為題目說了允許刪除一個字元來構成迴文字串,所以我們在遇到第一個不是迴文的兩個字元後,可以通過isValidPalindrome

方法判斷夾在leftright之間的子串是不是迴文子串。這樣,當遇到第一組不相同的字元後,我們進入isValidPalindrome判斷,如果子串繼續不相同,那麼就不是迴文字串,如果相同就是。

具體程式碼如下:

class Solution {
    public boolean validPalindrome(String s) {
        int left = 0, right = s.length() - 1;
        char[] chars = s.toCharArray();
        while (left < right) {
            if (chars[left] != chars[right])
                //如果兩個子串有一個不是迴文子串,那麼該字串就不是迴文字串
                return isValidPalindrome(chars, left + 1, right) || isValidPalindrome(chars, left, right - 1);
            left++;
            right--;
        }
        return true;
    }

    private boolean isValidPalindrome(char[] chars, int left, int right) {
        while (left < right) {
            if (chars[left++] != chars[right--])
                return false;
        }
        return true;
    }
}