184、驗證迴文字串II
阿新 • • 發佈:2019-01-10
題目描述
給定一個非空字串 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; } }