Pintia公共子串查找

# 2022.6.2
# 关于最后一题的题解报告
# 首先关于求最长公共字串的题目,我们通常使用动态规划的方法来解决
# 什么叫做动态规划:其实就和高中里的数学归纳法比较相近,就是从 n-1 的情况推到 n 的情况
# 现在我们从题目出发,题目给了两个字符串 a 和 b ,要求两个字符串的最长公共字串
# 因此我们要维护一些东西
# 我们维护一个二维数组 f[i][j] ,那f[i][j] 表示的是什么意思呢?
# f[i][j] 表示的是对于a字符串中以第i个字符结尾的,b字符串中以第j个字符结尾的最长公共字串的长度
# 下面我们就考虑状态转移:
# 对于一个 i j 有两种情况:
# 1、 a[i] != b[j] 那么明显会有f[i][j]=0
# 2、 a[i] == b[j] 那么 f[i][j]=f[i-1][j-1]+1 就可以从第i-1个和第j-1个递推过来
# 那么我们就可以开始手撕题目了
a=input()
b=input()
f=[[0 for j in range(len(b))] for i in range(len(a))] # 构造二维数组f
for i in range(len(a)):
    for j in range(len(b)):
        if a[i]!=b[j]:
            f[i][j]=0
        else:
            f[i][j]=f[i-1][j-1]+1
# 维护了f[i][j] 我们就要去找最长的长度了
len_max=0
daan=""
for i in range(len(a)):
    for j in range(len(b)):
        if f[i][j]>len_max:
            daan=""
            len_max=f[i][j]
            for k in range(i-len_max+1,i+1):
                daan=daan+a[k]
print(daan)

# 2022.6.2
# 关于最后一题的题解报告
# 首先关于求最长公共字串的题目,我们通常使用动态规划的方法来解决
# 什么叫做动态规划:其实就和高中里的数学归纳法比较相近,就是从 n-1 的情况推到 n 的情况
# 现在我们从题目出发,题目给了两个字符串 a 和 b ,要求两个字符串的最长公共字串
# 因此我们要维护一些东西
# 我们维护一个二维数组 f[i][j] ,那f[i][j] 表示的是什么意思呢?
# f[i][j] 表示的是对于a字符串中以第i个字符结尾的,b字符串中以第j个字符结尾的最长公共字串的长度
# 下面我们就考虑状态转移:
# 对于一个 i j 有两种情况:
# 1、 a[i] != b[j] 那么明显会有f[i][j]=0
# 2、 a[i] == b[j] 那么 f[i][j]=f[i-1][j-1]+1 就可以从第i-1个和第j-1个递推过来
# 那么我们就可以开始手撕题目了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值