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这个词,以为必须要删掉一个了,结果写了个O(m*n)的做法,把每个字母都去掉一遍,然后reverse,看跟原串是否一致。
后来我有个一个思路,第一次遇到不一致的,就跳过,左边跳还是右边跳要判断一下,但是没法AC,感觉这做法确实有问题。
最后我又有了个思路:
遇到不一致的,直接把响应的两个都char都去掉,reverse一下(其实不需要reverse..首位对比就行),如果有一个等于原串,就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;
}