【LeetCode】680. 验证回文字符串 Ⅱ

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

示例 1:

输入: "aba"
输出: True
示例 2:

输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:

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

思路

  • 判断是否是回文 首先可以对字符串进行reverse 判断是否相同
  • 如果不同 那么删除这个字符比较剩下字符是否是回文 那么这里就可以用递归
  • 如果不相同 怎么处理?
  1. 因为无法判断这个字符是在左边还是在右边,所以我们可以对左右两边都进行判断,此处可以使用函数调用 ,不用写两个模块
  • 对于字符串奇偶的判断 使用low<end 因为中间的字符不用管 有还是没有 有,是什么都不重要

代码

class Solution {
public:
    bool ishuiwen(string s1,int low,int high){
        while(low<high){
            //对不相等进行处理 相等就继续靠近
            if(s1[low]!=s1[high]){
                //在子回文串中不相等就break;
                return false;
            }
            low++;
            high--;
        }
        return true;
    }
    bool validPalindrome(string s) {
        string tmp=s;
        int start=0;
        int end=s.size()-1;
        int len=s.size();
        bool flag1=true,flag2=true,result=true;
        std::reverse(tmp.begin(),tmp.end());
        if(s==tmp){
             return true;
             }
                while(start<end){
                if(s[start]!=s[end]){
                    result=ishuiwen(s,start+1,end)||ishuiwen(s,start,end-1);
                    //因为不知道该删除的字符是在左边还是在右边 所以我们调用两次,结果一个为真即可;
                    //立刻就return 不然会重新赋值
                }
                  start++;
                    end--;}
       return result;
    }
};

官方版本

class Solution {
public:
    bool checkPalindrome(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 = s.size() - 1;
        while (low < high) {
            char c1 = s[low], c2 = s[high];
            if (c1 == c2) {
                ++low;
                --high;
            }
            else {
                return checkPalindrome(s, low, high - 1) || checkPalindrome(s, low + 1, high);
            }
        }
        return true;
    }
};


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值