字符串匹配问题-最长公共子串

问题

给定两个字符串str1和str2,输出两个字符串的最长公共子串。

问题分析
利用动态规划,依次匹配str1[i]和str2[j]判断是否相同:
1.相同,上一步匹配的子串长度为dp[i-1][j-1],则状态转换dp[i][j] = dp[i-1][j-1]+1,同时记录新的子串匹配的终点indxend;
2.不相同,则状态dp[i][j]=0(匹配的是连续公共子串,所以当前字符不匹配,长度更新为0)

注意:若匹配的字符串任意一个位于字符串的起始位置,则说明之前不可能存在匹配的子串,所以dp[i][j]=1 (i0 or j0). 

字符串abcde
c00100
a10000
b02000
e00001
d00010

如上表,str1=‘abcde’,str2=cabed,最长公共子串为s=ab,maxlen=2。

def findsubstr(s1,s2):
    #找出字符串s1和s2之间最长的公共子串
    
    n1 = len(s1)
    n2 = len(s2)
    
    dp = [[0]*n2 for _ in range(n1)]
    maxlen = 0
    idxend = 0
    
    for i in range(n1):
        for j in range(n2):
            if s1[i]==s2[j]:
                if i==0 or j==0: #匹配字符其中一个位于字符串起始位置
                    dp[i][j] = 1
                else:
                    dp[i][j] = dp[i-1][j-1] + 1 #更新当前公共子串长度
            
            if dp[i][j]>maxlen: #更新公共子串长度
                maxlen = dp[i][j]
                idxend = i
            
    
    return s1[idxend-maxlen+1:idxend+1] #返回公共子串

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值