题目描述:
- 验证回文字符串 Ⅱ
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: s = “aba” 输出: true
示例 2:
输入: s = “abca” 输出: true 解释: 你可以删除c字符。
示例 3:
输入: s = “abc” 输出: false
提示:
1 <= s.length <= 10^5
s 由小写英文字母组成
题解:
代码:
class Solution13 {
public static boolean validPalindrome(String s) {
int len = s.length();
if (len == 1) {
return true;
}
int x = len / 2;
String s_left = s.substring(0, x);
String s_right = s.substring(x);
if (len % 2 == 1) {
for (int i = 0; i < x; i++) {
if (s_left.charAt(i) != s_right.charAt(x - i)) {
if ((i + 1) < x && s_left.charAt(i + 1) == s_right.charAt(x - i)) {
for (int j = i; j < (x - i); j++) {
if ((j + 1) < (x - i) && s_left.charAt(j + 1) != s_right.charAt(x - j)) {
if (s_right.charAt(x - j - 1) == s_right.charAt(x - j - 2)){
return true;
}
return false;
}
}
return true;
} else if (s_left.charAt(i) == s_right.charAt(x - i - 1)) {
for (int j = i; j < x; j++) {
if (s_left.charAt(j) != s_right.charAt(x - j - 1)) {
return false;
}
}
return true;
}else return i + 1 == x && s_right.charAt(0) == s_right.charAt(1);
}
}
} else {
for (int i = 0; i < x; i++) {
if (s_left.charAt(i) != s_right.charAt(x - i - 1)) {
if ((i + 1) < x && s_left.charAt(i + 1) == s_right.charAt(x - i - 1)) {
for (int j = i; j < x; j++) {
if ((j + 1) < x && s_left.charAt(j + 1) != s_right.charAt(x - j - 1)) {
return false;
}
}
return true;
} else if (x - i - 2 >= 0 && s_left.charAt(i) == s_right.charAt(x - i - 2)) {
for (int j = i; j < x - 1; j++) {
if (s_left.charAt(j) != s_right.charAt(x - j - 2)) {
return false;
}
}
return true;
}else return (i + 1) == x;
}
}
}
return true;
}
}
思路:
一开始想着建俩数组,将测试用的数组对半存,按照循环判断,是否是回文数组,遇到要删除的元素则分情况去判断,当第二次遇到不符合要求的数,就直接返回 false ,但后续确实要分很多种情况,这种方法不太行是真的,然后就有了这个劣质版。。。
问题 :
不太理解为啥已经可以运行到 return true ,但结果会是 false (emo 了…)
测试用例: "aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga"
反思:
后续也有去看别人的题解,用双指针去判断,确实会更容易些(学到了),像这次可能过于执着一开始劣质版的方法了,一条路走到黑。。。耗了很久(PS:又是碌碌无为的一天啊)下次像遇到这种情况,还是先去看看别人的方法吧 ^ _ ^
|