Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.
Example 1:
Input: "aba"
Output: True
Example 2:
Input: "abca"
Output: True
Explanation: You could delete the character 'c'.
這題是'Easy',但是值得一做。我一開始審題不清,沒注意at most這個(gè)詞,以為必須要?jiǎng)h掉一個(gè)了,結(jié)果寫了個(gè)O(m*n)的做法,把每個(gè)字母都去掉一遍,然后reverse,看跟原串是否一致。
后來我有個(gè)一個(gè)思路,第一次遇到不一致的,就跳過,左邊跳還是右邊跳要判斷一下,但是沒法AC,感覺這做法確實(shí)有問題。
最后我又有了個(gè)思路:
遇到不一致的,直接把響應(yīng)的兩個(gè)都char都去掉,reverse一下(其實(shí)不需要reverse..首位對比就行),如果有一個(gè)等于原串,就return true。AC了。
public boolean validPalindrome(String s) {
if (s == null) return true;
boolean firstTime = true;
int start = 0, end = s.length() - 1;
while (start < end) {
if (s.charAt(start) != s.charAt(end)) {
String t1 = s.substring(0, start) + s.substring(start + 1);
String t2 = s.substring(0, end) + s.substring(end + 1);
if (reverse(t1).equals(t1) || reverse(t2).equals(t2)) {
return true;
} else
return false;
}
start++;
end--;
}
return true;
}
private String reverse(String s) {
StringBuilder sb = new StringBuilder(s.length());
int end = s.length() - 1;
for (int i = end; i >= 0; i--) {
sb.append(s.charAt(i));
}
return sb.toString();
}
別人的寫法:
public boolean validPalindrome(String s) {
int l = -1, r = s.length();
while (++l < --r)
if (s.charAt(l) != s.charAt(r))
//這寫法挺賊的
return isPalindromic(s, l, r+1) || isPalindromic(s, l-1, r);
return true;
}
public boolean isPalindromic(String s, int l, int r) {
while (++l < --r)
if (s.charAt(l) != s.charAt(r)) return false;
return true;
}