剑指 Offer II 019. 最多删除一个字符得到回文

地址:

力扣https://leetcode-cn.com/problems/RQku0D/

该题与   680. 验证回文字符串 Ⅱ 相同

题目:

给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。

示例 1:

输入: s = "aba"
输出: true


示例 2:

输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符


示例 3:

输入: s = "abc"
输出: false

提示:

1 <= s.length <= 105
s 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/RQku0D
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

看下几个示例:

回文:abba,abcba

        可以看出只要是回文删除 1 次依旧是回文

非回文:abcb,bcba,cbbcc

        左指针指向[0],右指针指向[len-1],调整一次左指针或右指针,剩下的如果是回文那么也可以

        再来看个长点的示例:ebcbbececabbacecbbcbe

                左指针调整可以[5] ->[6],右指针调整不可以 [15]->[14],总共调整次数也是一次

所以结论是,用双指针来扫描整个字符串,如果是回文 或者 通过一次调整后的子串也是回文,那么结果就是可以的,否则不可以

bool checksub(char *s, int i, int j)
{
    bool ret = true;

    while(i < j)
    {
        if(s[i] != s[j])
        {
            ret = false;
            break;
        }
        i++;
        j--;
    }

    return ret;
}

bool validPalindrome(char * s){
    int slen = strlen(s);
    int i,j;
    int maxjudge = 0;
    bool ret = true;

    i = 0;
    j = slen - 1;

    while(i < j)
    {
        if(s[i] != s[j])
        {
            if( checksub(s, i, j-1) || checksub(s, i+1, j) )
            {
                ret = true;
                break;
            }
            else
            {
                ret = false;
                break;
            }
        }

        i++;
        j--;
    }

    return ret;
}

查看更多刷题笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值