最长公共子串
admin
2023-07-03 05:03:05
0

题目描述:
给定两个字符串s1和s2,计算其最长公共子串的长度,并返回所有可能的最长公共子串。

# -*- coding: utf-8 -*-
# @Time         : 2019-09-22 22:57
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : longestCommonSubstring.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

def lcs(s1, s2):
    """
    现在我们知道了,如果遇到输入是两个字符串的,需要用到的动态规划的话,那么我们需要的状态是一个
    二维的矩阵。
    首先我们需要定义这个矩阵中每个元素的意义:
    dp[i][j]代表了s1[: i + 1]和s2[: j + 1]以s1[i]和s2[j]结尾的公共子串的长度。
    那么关键就在于如何确定转换方程和如何初始化这个状态矩阵了。

    显然,由于dp[i][j]计算的是同时以s1[i]和s2[j]为结尾公共子串的长度,
    如果s1[i] != s2[j],那么dp[i][j] = 0
    当s1[i] == s2[j]时,dp[i][j] = dp[i - 1][j - 1] + 1
    :param s1: 输入的第一个字符串
    :param s2: 输入的第二个字符串
    :return: 最大公共子串长度、以及最大公共子串的具体值
    """
    # 为了方便编程,先在s1和s2前面加入一个空格占位
    s1 = ' ' + s1
    s2 = ' ' + s2
    rows = len(s1)
    cols = len(s2)
    dp = [[0] * cols for _ in range(rows)]
    maxlen = 0
    for i in range(1, rows):
        for j in range(1, cols):
            if s1[i] == s2[j]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                maxlen = max(maxlen, dp[i][j])
            else:
                dp[i][j] = 0

    res = []
    for i in range(1, rows):
        for j in range(1, cols):
            # s1[i]为结尾的子串,截取长度为maxlen即可
            if dp[i][j] == maxlen:
                res.append(s1[i - maxlen + 1: i + 1])

    return maxlen, res

def main():
    s1 = 'ABCBDEFBWD'
    s2 = 'BCBWD'
    maxlen, res = lcs(s1, s2)
    print(maxlen)
    print(res)

if __name__ == '__main__':
    main()

相关内容

热门资讯

危急时刻,退役军人冲进车流救人 极目新闻通讯员 常梦星 游小亮5月30日中午12时许,武汉市武商商圈附近发生一起两辆电动车正面相撞的...
清华硕士做纹眉师1年多,最高月... 拥有中国传媒大学本科学历、清华大学美术学院硕士学位的广州90后Yoyo,如今是一名专业纹眉师。这份看...
“背手负鼠”火了,网友到处寻图... 这几天,很多人的聊天软件都被一个外形有点像老鼠的动物“承包”了。只见它面对窗外幽蓝的天空,负手而立,...
SpaceX被曝估值下调,马斯... 据美国彭博社29日援引知情人士的话报道,美国太空探索技术公司(SpaceX)正寻求在其首次公开募股(...
郑丽文横跨五大城访美,谢寒冰乐... 中国国民党主席郑丽文将于6月1日启程访问美国,由西向东横跨旧金山、纽约、波士顿、华府及洛杉矶等五大城...
视频丨首次突破、刷新纪录!本周... 本周我国在航天、基建、工程等领域迎来突破从地下到太空从大国重器到汽车工业中国硬核实力接连刷新历史神舟...
上海“僵尸房”复活记:卖不掉的... 在房地产从业者的行话里,有一个并不正式却颇为形象的词——“僵尸房”。没有人能给出它的准确定义,更没人...
网红“悍马糖”被查 近日,据江苏南京《金陵警事》报道:看似普通糖果,号称“增强精力”,实则暗藏致命风险。南京秦淮警方成功...
灶具打不着火原因 1、如果灶具进入了过压保护的时候,灶具是不会打火启动的,所以这样就会导致灶具打不着火的问题发生。2、...
灶一边打不着火 1、可能是由于一边的打火针上面比较脏,出现点火针跑偏的现象。2、也有可能是由于打火的时候,打不着火的...