680. 验证回文字符串 Ⅱ

双指针+递归来处理

题目要求只删除一个元素,我们可以使用双指针一次比较头尾字符,遇到

不一致的字符做删除操作,这里就出现了2种方案,删除左侧字符还是右侧字符

于是我们递归来处理这2种情况。同时使用全局变量记录删除元素数,当大于1时

即可判定为false

时间O(n),空间O(1)(注意,这里虽然存在递归,但是根据题意以及剪枝操作,这里实际上只递归了1层)

 1 class Solution {
 2     int count=0;
 3     public boolean validPalindrome(String s) {
 4         int left=0,right=s.length()-1;
 5         while(left<right){
 6             if(s.charAt(left)==s.charAt(right)){
 7                 left++;
 8                 right--;
 9             }else{
10                 count++;
11                 if (count>1){
12                     return false;
13                 }
14                 // 递归时需要注意边界值处理,substring是不包含右侧边界的
15                 return validPalindrome(s.substring(left,right)) || 
16                 validPalindrome(s.substring(left+1,right+1));
17             }
18         }
19         return true;
20     }
21 }
争取早日不再是一只菜鸡
原文地址:https://www.cnblogs.com/jchen104/p/14733966.html