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

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

作者: 霍尔元件 | 来源:发表于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]

相关文章

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

    最长公共子串 子序列 最长回文子串 子序列 简单易懂的python代码 子串容易输出,子序列比较难(输出str而...

  • 子串 子序列 总结

    最长公共子串 子串的要求比子序列严格,所以可以讨论子串的终点 最长公共子序列 DP解 递归+memo 最长公共回文...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 字符串的几个问题

    1.最长公共子序列2.最长公共子串3.最长回文串4.最长回文序列5.最长递增序列6.最长先增后减序列7.(最短)编...

  • 最长公共子序列和最长公共子串

    最长公共子序列和最长公共子串区别 最长公共子串(Longest CommonSubstring)和最长公共子序列(...

  • 1143. 最长公共子序列/5. 最长回文子串

    1143. 最长公共子序列 相关标签: DP 5. 最长回文子串 相关标签 :DP

  • LCS问题

    LCS问题包括最长公共子序列和最长公共子串,其中,最长公共子串要求必须连续。 对于二者的求解方式 最长公共子序列:...

  • 算法(04)动态规划

    零钱问题 背包问题 最长公共子序列 最长公共子串 最长上升子序列 最大连续子序列和

  • 最长公共子序列问题解析

    问题解读 最长公共子序列问题,就是找出两个字符串中,存在的最长的子序列 什么是子序列呢?子序列不同于公共子串,子串...

  • 最长回文子序列

    该问题区别于最长回文子串,子串必须是连续的,而子序列则可以跳跃,例如AABCAA的最长回文子串为AA,但是它的最长...

网友评论

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

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