dp的核心思想是分治策略和表存储。
分治策略并非dp所独有,很多算法都运用了把问题拆解为子问题的做法,比如递归。
表存储应该是dp比较独有的一种方式,通过存储一些中间结果,可以避免重复计算,从而提升程序运行的速度。
def max_length(s1,s2):
# 最大公共子串,用dp求解
max_len,max_str=0,''
# 初始化矩阵
res=[[0 for j in range(len(s2))] for i in range(len(s1))]
# dp
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
# 首行或者首列单独处理
if i==0 or j==0:
res[i][j]=1
else:
res[i][j]=res[i-1][j-1]+1
if max_len<res[i][j]:
max_len=res[i][j]
max_str=s1[i+1-max_len:i+1]
# 返回最终结果
return max_str,max_len
s1,s2='sdakfhdfdasfdsafdsaakjhfabcaaa','fdafdsafdasfewafew'
max_length(s1,s2)
本文详细介绍了如何使用动态规划(DP)解决字符串最大公共子串问题,通过实例展示了如何构建状态转移方程并利用表存储技巧避免重复计算,以提高算法效率。以 'sdakfhdfdasfdsafdsaakjhfabcaaa' 和 'fdafdsafdasfewafew' 为例,演示了如何找到最长公共子串及其长度。
1023

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



