《剑指offer》面试题19:最多删除一个字符得到回文

本文探讨了一种算法,通过最少删除一个字符,判断给定字符串是否能转换成回文。通过逐个尝试删除首尾字符并检查剩余部分是否为回文,实现高效判断。示例展示了如何使用这种方法处理字符串 'WasitacatIsaw?' 和其变体。
"""
题目:给定一个字符串传,请判断如果最多从字符串中删除一个字符能不能得到一个回文字符串。
     例如,如果输入字符串’ABCA‘,由于删除字符’B'或者‘C'就能得到一个回文字符串,因此输出为True
解题思路:该题与第18题“有效的回文”类似,不同之处在于如果出现P1指针的值于P2指针的值不相同的情况,要进行尝试。
        首先尝试P1侧删除一个字符能否形成回文,如果不行,则P1侧要恢复刚才删除的字符
        然后尝试P2侧删除一个字符能否形成回文,如果不行,则可以return False了。
        与作者不同的是,我在处理时,如果发现两头的字符相同,则直接删除两头的元素,这样就能够不断的缩短字符串,
        这样一能方便自己调试,二能减少is_mirror()函数的运行时间。
"""
import re


def is_mirror(new_s):
    p1 = 0
    p2 = len(new_s)-1
    while p1 != p2:
        if new_s[p1] != new_s[p2]:
            return False
        p1 += 1
        p2 -= 1
    return True


def one_chance_is_mirror(s):
    pattern = re.compile('[a-zA-Z0-9]')
    new_s = pattern.findall(s.upper())
    if is_mirror(new_s):
        return True
    else:
        while len(new_s) != 0:
            if new_s[0] == new_s[-1]:
                new_s.pop(0)
                new_s.pop(-1)
            else:
                left = new_s.pop(0)
                if is_mirror(new_s):
                    return True
                else:
                    new_s.insert(0, left)
                    right = new_s.pop(-1)
                    if is_mirror(new_s):
                        return True

                return False

s = 'Was it a cat I saw ?'
s1 = 'Was it a cats I saw ?'
s2 = 'Was it a catss I saw ?'
s3 = 'abca'
print(one_chance_is_mirror(s))
print(one_chance_is_mirror(s1))
print(one_chance_is_mirror(s2))
print(one_chance_is_mirror(s3))

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值