美文网首页算法
最长公共子串 子序列 最长回文子串 子序列

最长公共子串 子序列 最长回文子串 子序列

作者: 霍尔元件 | 来源:发表于2019-08-05 15:37 被阅读0次

    最长公共子串 子序列 最长回文子串 子序列

    简单易懂的python代码

    子串容易输出,子序列比较难(输出str而不是str的长度)

    def longestCommonSubstr(self, s, p):  # 为了方便地将短公共子串拓展到长公共子串 必须使用maxEndHere
        if not s or not p:
            return ""
        dp = [[0] * (len(p) + 1) for _ in range(len(s) + 1)]
        res = ""
        for i in range(len(s)):
            for j in range(len(p)):
                if s[i] == p[j]:
                    dp[i + 1][j + 1] = 1 + dp[i][j]
                    if dp[i + 1][j + 1] > len(res):
                        res = s[i + 1 - dp[i + 1][j + 1]:i + 1]
        return res
    
    def longestCommonSubseq(self, s, p):  # 性质: 串越长,res越大 所以return dp[-1][-1]
        if not s or not p:
            return ""
        dp = [[0] * (len(p) + 1) for _ in range(len(s) + 1)]
        for i in range(len(s)):
            for j in range(len(p)):
                if s[i] == p[j]:
                    dp[i + 1][j + 1] = 1 + dp[i][j]
                else:
                    dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1])
        return dp[-1][-1]
    
    def longestPalindromeSubStr(self, s):
        if not s:
            return ""
        dp = [[False] * len(s) for _ in range(len(s))]
        res = ""
        for i in range(len(s), -1, -1):  # 起点
            for j in range(i, len(s)):  # 终点
                if s[i] == s[j] and (j - i <= 2 or dp[i + 1][j - 1]):
                    dp[i][j] = True
                if dp[i][j] and j - i + 1 >= len(res):  # 等长情况下给出第一个子串 需要加上=
                    res = s[i:j + 1]
        return res
    
    def longestPalindromeSubSeq(self, s):
        if not s:
            return ""
        dp = [[0] * len(s) for _ in range(len(s))] # dp[i][j]定义的子串s[i:j+1]的最长回文子序列
        for i in range(len(s) - 1, -1, -1): # 地点
            dp[i][i] = 1
            for j in range(i + 1, len(s)): # ij重合的情况跳过
                if s[i] == s[j]:
                    dp[i][j] = 2 + dp[i + 1][j - 1]
                else:
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
        return dp[0][-1]
    

    相关文章

      网友评论

        本文标题:最长公共子串 子序列 最长回文子串 子序列

        本文链接:https://www.haomeiwen.com/subject/idumdctx.html