补齐为回文串
【问题】回文串也中镜像串,就是左右对称的串。“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"))
该博客探讨如何使用递归和动态规划解决将字符串转换为回文串的问题,通过分析首尾字符判断填充策略,并利用缓存避免重复计算,提高效率。
&spm=1001.2101.3001.5002&articleId=102722899&d=1&t=3&u=16cf3b04b4a0475e8682b71899a6a018)
513

被折叠的 条评论
为什么被折叠?



