LCR 019. 验证回文串 II
一、题目描述
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = “aba”
输出: true
示例 2:
输入: s = “abca”
输出: true
解释: 可以删除 “c” 字符 或者 “b” 字符
示例 3:
输入: s = “abc”
输出: false
提示:
1 <= s.length <= 105
s 由小写英文字母组成
二、题目解析
1、中心扩散法
class Solution {public boolean validPalindrome(String s) {if(s == null || s.length() == 0){return false;}if(s.length() == 1){return true;}int n = s.length();if(isValidTarget(s)){return true;}for(int i = 0;i < n;i++){StringBuilder builder = new StringBuilder(s);builder.deleteCharAt(i);if(isValidTarget(builder.toString())){return true;}}return false;}public boolean isValidTarget(String s) {int n = s.length();Stack<Character> stack = new Stack();int i;for(i = 0;i < n / 2;i++){stack.push(s.charAt(i));}if(n % 2 == 1){i++;}for(;!stack.isEmpty() && i < n;i++){if(stack.pop() != s.charAt(i)){return false;}}return true;}
}
缺点:涉及删除字符操作操作复杂,运行超时
2、中心扩散法,在删除一个元素后不方便使用递归继续判断是否回文,考虑使用双指针从首尾开始遍历
class Solution {public boolean validPalindrome(String s) {return check(s,0,s.length()-1,true);}boolean check(String s,int i,int j,boolean flag){ // flag标识只有一次机会while (i<j){if(s.charAt(i)!=s.charAt(j)){if(!flag){// 已经去掉一个了,失败return false;}// 左边去掉boolean b1 = check(s, i, j - 1, false);// 右边去掉boolean b2 = check(s, i+1, j , false);return b1||b2; // 有一种成功即可}i++;j--;}return true;}
}