python3 题解(36 补齐为回文串)

该博客探讨如何使用递归和动态规划解决将字符串转换为回文串的问题,通过分析首尾字符判断填充策略,并利用缓存避免重复计算,提高效率。

补齐为回文串

【问题】回文串也中镜像串,就是左右对称的串。“a”, “aba”,“baab”, 都是回文串。
给定一个串,至少要添加上多少个字母,才能将它改造为回文串呢?

分析:
这可以通过递归的方法,不断缩小规模来实现。
如果一个串的首尾两个字符相同,那么最小次数就是去掉首尾后的子串的递归问题。
如果不同,有两种改造方案。
a…b ⇒ a…ba

a…b => ba…b
选哪个方案取决于,递归子问题哪个的步数小。

### 给定一个串,需要补充多少个字母才能变成镜像串
def mirror(s):
	if len(s) < 2: return 0
	if s[0] == s[-1]: return mirror(s[1:-1])
	x = mirror(s[1:])
	y = mirror(s[:-1])
	return min(x,y) + 1

if __name__ == '__main__':
    print(mirror("abc"))
    print(mirror("aba"))
    print(mirror("abb"))
    print(mirror("abababc"))
    print(mirror("ababcabc"))    

这个解法会有重复计算的问题,当规模较大的时候就很慢了。
可以考虑对子问题进行缓存,重复的直接取结果,不用再次计算。

def mirror(s):
    his = {}
    def f(s):
        if len(s) < 2: return 0
        if s in his: return his[s] 
        
        if s[0] == s[-1]:
            t = f(s[1:-1])
        else:
            x = f(s[1:])
            y = f(s[:-1])
            t = min(x,y) + 1
        his[s] = t
        return t
    return f(s)

if __name__ == '__main__':
    print(mirror("abababc"))
    print(mirror("ababcabc"))
    print(mirror("abcdefghiklmnopqrstuvwxyz"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值