思路:定义两个指针i,j,从字符串的左右两侧开始起跑,相等就继续,不相等就停下,继续判断 (i+1 == j || j-1 == i),这时发现产生了递归现象,于是可以将该判断步骤独立成一个递归函数又因为题干要求 “最多移除一个字符” ,所以这里引入一个计数器count函数可写为 validPalindrome(String s,int i,int j,int count)
/**
* 百题挑战计划 第一题
* LEETCODE_680(Valid Palindrome II - E)
* 思路:定义两个指针i,j,从字符串的左右两侧开始起跑,相等就继续,不相等就停下,
* 继续判断 (i+1 == j || j-1 == i),这时发现产生了递归现象,于是可以将该判断步骤独立成一个递归函数
* 又因为题干要求 “最多移除一个字符” ,所以这里引入一个计数器count
* 函数可写为 validPalindrome(String s,int i,int j,int count)
*/
public class ValidPalindrome {
public static void main(String[] args) {
long time1 = System.currentTimeMillis();
//String s = "eeccccbebaeeabebccceea";
//String s = "lcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupucul";
//String s = "abcdefghgfedcbba";
String s = "abca";
ValidPalindrome v = new ValidPalindrome();
System.out.println(v.validPalindrome(s));
long time2 = System.currentTimeMillis();
int time = (int) (time2 - time1);
System.out.println("用时:" + time + "毫秒");
}
public boolean validPalindrome(String s) {
if (s == null || s.length() == 0) return true;
return validPalindrome(s, 0, s.length()-1, 0);
}
private boolean validPalindrome(String s, int i, int j, int count) {
if (count > 1) return false;
while (i < j) {
if (s.charAt(i) == s.charAt(j)) {
i++;j--;
}
else {
return (validPalindrome(s, i+1, j, count+1) || validPalindrome(s, i, j-1, count+1));
}
}
return true;
}
}