1. 题目描述

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

  1. 输入: "aba"
  2. 输出: True

示例 2:

  1. 输入: "abca"
  2. 输出: True

解释: 你可以删除c字符。

注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

2. 解题思路

对于回文串,它具有对称性,我们可以使用双指针来实现:

设置两个指针ij,分别指向第一个和最后一个字符,并进行对比,如果两者相同,就不断向中间移动,再进行对比。

如果遇到两个字符不相等,那么就与另外一个的后者或前者进行对比,有以下两种情况:

  • 判断i+1j是否相等
  • 判断ij-1是否相等
    如果相等,就返回true

    3. 代码实现

    1. /**
    2. * @param {string} s
    3. * @return {boolean}
    4. */
    5. var validPalindrome = function(s) {
    6. let len =s.length
    7. let i = 0, j = len-1
    8. while (i<j&& s[i]===s[j]){
    9. i++
    10. j--
    11. }
    12. // 判断字符串是否回文
    13. function isPalindrome(a,b){
    14. while (a<b){
    15. if(s[a] !== s[b]){
    16. return false
    17. }
    18. a++
    19. b--
    20. }
    21. return true
    22. }
    23. if(isPalindrome(i+1,j)){
    24. return true
    25. }
    26. if(isPalindrome(i,j-1)){
    27. return true
    28. }
    29. return false
    30. };

    4. 提交结果

    680. 验证回文字符串 Ⅱ - 图1