网上有的大都是求两个字符串的最长公共子串,此代码在此基础上进行稍稍修改,做到了求所有公共子序列。
代码如下所示:

s1='超市很多人因为今天是大减价。'
s2='因为今天是大减价,所以超市有很多人。'
s11='也就是说遇冷夏。'
s22='也就是说遇到了冷夏。'

def getNumofCommonSubstr(str1, str2):
    lstr1 = len(str1)
    lstr2 = len(str2)
    record = [[0 for i in range(lstr2 + 1)] for j in range(lstr1 + 1)]  # 多一位
    maxNum = 0  # 最长匹配长度
    max_end = 0  # 匹配的终止
    max_start=0 #匹配的起始位
    map_maxstr={}#key为开始位置,value为最大匹配字符串
    for i in range(lstr1):
        for j in range(lstr2):
            if str1[i] == str2[j]:
                # 相同则累加
                record[i + 1][j + 1] = record[i][j] + 1
                if record[i + 1][j + 1] > maxNum:

                    # 获取最大匹配长度
                    maxNum = record[i + 1][j + 1]
                    # 记录最大匹配长度的开始位置

                    p= i + 1
                    max_start=i+1 - maxNum
                    map_maxstr[max_start]=str1[p - maxNum:p]
                    maxNum=0
    # return str1[p - maxNum:p], maxNum
    return map_maxstr

map_maxstr={}
map_maxstr = getNumofCommonSubstr(s1, s2)#返回匹配字符串
for m in map_maxstr:
     print(map_maxstr.get(m))


map_maxstr = getNumofCommonSubstr(s22, s11)#返回匹配字符串
for m in map_maxstr:
     print(map_maxstr.get(m))

最终结果:
求两字符串所有公共子序列
如有问题,欢迎指正!

参考博客:https://blog.csdn.net/qq_27361945/article/details/79817431

相关文章: