1. 程式人生 > >184、驗證迴文字串II

184、驗證迴文字串II

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

示例 1:

輸入: “aba”
輸出: True
示例 2:

輸入: “abca”
輸出: True
解釋: 你可以刪除c字元。
注意:

字串只包含從 a-z 的小寫字母。字串的最大長度是50000。
當遇到不同時,我們需要判斷是移動前面的指標還是後面的指標,當移動前面
指標可以時設定一個標緻,這裡為flag1
程式碼如下

class Solution {
    public boolean validPalindrome(String s) {
       int start = 0;
		int end = s.length() - 1;
		int indexstart = 0;
		int indexend = 0;
		boolean flag = true;
        boolean flag1 = true;
		while (start < end) {
			if(s.charAt(start) == s.charAt(end)){
				start ++;
				end --;
			}else if(flag){
				indexend = end;
				indexstart = start;
				start++;
				flag = false;
			}else {
                flag1 = false;
				break;
			}
			
		}
        	if(flag || flag1)
			return true;
		indexend --;
		while (indexend > indexstart) {
			if(s.charAt(indexend) == s.charAt(indexstart)){
				indexend --;
				indexstart ++;
			}else {
				return false;
			}
		}
		
		return true; 
    }
}

但是這種方法效率不是很高,不清楚為什麼
排名靠前的程式碼

class Solution {
    public boolean validPalindrome(String s) {
        if (s == null || s.length() <= 2) {
            return true;
        }
        
        char[] arr = s.toCharArray();
        
        for (int i = 0, j = arr.length - 1; i <= j; i++, j--) {
            if (arr[i] != arr[j]) {
                    return isPalindrome(arr, i, j - 1) || isPalindrome(arr, i + 1, j) ;
            }
        }
        
        return true; 
    }
    private boolean isPalindrome(char[] arr, int i, int j) {
        while (i <= j) {
            if (arr[i] == arr[j]) {
                i++;
                j--;
            }
            else {
                return false;
            }
        }
        return true;
    }
}