[LeetCode] 680. Valid Palindrome II
Given a string s
, return true
if the s
can be palindrome after deleting at most one character from it.
Example 1:
Input: s = "aba" Output: true
Example 2:
Input: s = "abca" Output: true Explanation: You could delete the character 'c'.
Example 3:
Input: s = "abc" Output: false
Constraints:
1 <= s.length <= 105
s
consists of lowercase English letters.
验证回文字符串II。
给定一个非空字符串 s
,最多删除一个字符。判断是否能成为回文字符串。
题意跟版本一很接近,版本一问的只是 input 是不是回文,版本二问的是如果允许最多删除一个字符,问剩下的内容还是不是回文。这里可删可不删。思路还是双指针往中间逼近,同时需要写一个 helper 函数帮助判断回文情况。while 循环的一开始,如果两边的 char 相同,就往中间逼近;如果不同,则判断这两种情况里面是否有任意一个能 return true,因为只要有一个 return true 就说明删除一个字符,剩下的部分是有效的。
时间O(n)
空间O(1)
Java实现
1 class Solution { 2 public boolean validPalindrome(String s) { 3 int left = 0; 4 int right = s.length() - 1; 5 while (left < right && s.charAt(left) == s.charAt(right)) { 6 left++; 7 right--; 8 } 9 if (helper(s, left + 1, right)) { 10 return true; 11 } 12 if (helper(s, left, right - 1)) { 13 return true; 14 } 15 return false; 16 } 17 18 private boolean helper(String s, int left, int right) { 19 while (left < right) { 20 if (s.charAt(left) != s.charAt(right)) { 21 return false; 22 } 23 left++; 24 right--; 25 } 26 return true; 27 } 28 }
JavaScript实现
1 /** 2 * @param {string} s 3 * @return {boolean} 4 */ 5 var validPalindrome = function (s) { 6 let left = 0; 7 let right = s.length - 1; 8 while (left < right && s[left] === s[right]) { 9 left++; 10 right--; 11 } 12 if (checkPalindrome(s, left + 1, right)) { 13 return true; 14 } 15 if (checkPalindrome(s, left, right - 1)) { 16 return true; 17 } 18 return false; 19 }; 20 21 var checkPalindrome = function (s, left, right) { 22 while (left < right) { 23 if (s[left] !== s[right]) { 24 return false; 25 } 26 left++; 27 right--; 28 } 29 return true; 30 };
相关题目