最多删除一个字符得到回文

  1. 链接:
    https://leetcode.cn/problems/RQku0D/
  2. 题目:
    给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
    示例:
输入: s = "aba"
输出: true

输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
  1. 思路:
    1. 第一种,不封装函数。双指针,low指向低位,high指向高位,如果low和high所指的字母相等,则low++;high--;。如果不相等,尝试删除当前的low或者high所指字符,两种删除都失败,那么返回false。
    2. 第二种,封装函数。双指针,low和high,如果二者所指字符相同,同第一种。如果不相等,有两种可能性:删除低位[low+1,high]或者删除高位[low,high-1],对这两种子字符进行判断,如果都不是回文串则返回假,否则返真。
  2. 代码:
//第一种,不调用函数
class Solution {
public:
    bool validPalindrome(string s) {
        //先判断是不是回文串
        string s_rev(s.rbegin(),s.rend());
        if(s==s_rev)
        return true;
        int high,low;
        //用h和l来记录低位、高位是否可删除,
        //如果不可以删除,说明此种删除方法已经被使用,且无效
        bool h=true,l=true;
        low=0;
        high=s.size()-1;
        while(low<=high){
            if(s[low]==s[high]){
                low++;
                high--;
            }else if(l){
            //低位可以删除,判断高位删除是否被使用,
            //如果被使用,则复原高位指针
                if(!h)
                high++;
                low++;
                l=false;
            }else if(h){
            //高位可以删除,判断低位删除是否被使用,
            //如果被使用,则复原低位指针
                if(!l)
                low--;
                high--;
                h=false;
            }else if(!h&&!l){
            //如果都被使用了,但还是不相等,则返回false
                return false;
            }
        }
        return true;      
    }
};

//第二种,封装函数
class Solution {
public:
    bool judeg(const string& s,int low,int high){
        for(int i=low,j=high;i<j;i++,j--){
            if(s[i]!=s[j])
            return false;
        }
        return true;
    }
    bool validPalindrome(string s) {
      //第二种,调用函数
      int low=0,high;
      high=s.size()-1;
      while(low<high){
          if(s[low]==s[high]){
              low++;
              high--;
          }else
          return judeg(s,low+1,high)||judeg(s,low,high-1);
      }
      return true;
    }
};

版权声明:本文为yiyantangad原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。