最长公共子串
2019-09-22 23:31
1011 查看
题目描述:
给定两个字符串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()
相关文章推荐
- "求两个字符串的最长公共子串"(python)
- 求两个字符串公共子串的最长长度
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 最长公共子串(一步步优化)
- 算法导论 ch15 动态规划 最长公共子串
- hdu 1159/poj1458 Common Subsequence 最长公共子串
- 编辑距离,最长公共子序列,最长公共子串,最长递增子序列
- 最长公共子串LCS
- 最长公共子串算法-JAVA
- SPOJ 题目1812 LCS2 - Longest Common Substring II(后缀自动机求多个串的最长公共子串)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 两个字符串的最长连续公共子串
- spoj1811 Longest Common Substring(LCS)最长公共子串
- lcs.py 最长公共子串算法
- 最长公共子串(动态规划)
- poj 1159 最长公共子串LCS
- poj 2774 后缀数组 两个字符串的最长公共子串
- poj 3080 Blue Jeans(最长公共子串)
- 程序员面试100题之六:最长公共子串
- 算法作业6 动态规划 - 最长公共子串问题