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 }
争取早日不再是一只菜鸡