最长公共序列优化问题

法伦·皮

我正在尝试解决在两个字符串之间找到最长公共序列的问题。我使用了动态编程(DP),并尝试对其进行优化。但是我仍然在HackerRank上超时,我也不知道为什么。我使用的是Hunt–Szymanski算法的迭代版本。

我只使用了两行,而不是使用一个矩阵,而是将它们互换。我还消除了字符串开头和结尾的所有常见字符。我还使用了算法的迭代版本。我还能如何优化呢?

这是我的代码:

def commonChild(s1, s2):
    nr = 0
    while s1[0]==s2[0]:
        nr+=1
        s1=s1[1::]
        s2=s2[1::]
    while s1[-1]==s2[-1]:
        nr+=1
        s1=s1[0:-1]
        s2=s2[0:-1]

    row1 = [0]*(len(s1)+1)
    row2 = [0]*(len(s1)+1)


    for i in range(1,len(s1)+1):
        for j in range(1,len(s2)+1):


            if s1[j-1]==s2[i-1]:
                row2[j]=row1[j-1]+1


            else:

                row2[j]=max(row2[j-1], row1[j])


        row1=row2
        row2=[0]*(len(s1)+1)


    return row1[-1]+nr     

谢谢。

吴锡ong |

好好尝试。

请注意,您使用索引i来遍历s1在外环和指数j遍历s2在内部循环。

您应该让s1s2具有s2plus的长度1,即内部循环的长度plus 1

此外,您错误地使用j访问s1i访问s2您的实现。

最后,要克服超时问题,而不是常规的Python,请改用PyPy。

def commonChild(s1, s2):
    nr = 0
    while s1[0]==s2[0]:
        nr+=1
        s1=s1[1::]
        s2=s2[1::]
    while s1[-1]==s2[-1]:
        nr+=1
        s1=s1[0:-1]
        s2=s2[0:-1]
    #row1 = [0]*(len(s1)+1)
    #row2 = [0]*(len(s1)+1)
    row1 = [0]*(len(s2)+1)
    row2 = [0]*(len(s2)+1)
    for i in range(1,len(s1)+1):
        for j in range(1,len(s2)+1):
            #if s1[j-1]==s2[i-1]:
            if s1[i-1] == s2[j-1]:
                row2[j]=row1[j-1]+1
            else:
                row2[j]=max(row2[j-1], row1[j])
        row1=row2
        #row2=[0]*(len(s1)+1)
        row2 = [0]*(len(s2)+1)
    return row1[-1]+nr

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

最长公共子序列的界限

来自分类Dev

openMP的最长公共子序列

来自分类Dev

最长公共子序列算法说明

来自分类Dev

三个整数序列的最长公共子序列

来自分类Dev

固定长度子串的最长公共子序列

来自分类Dev

Python:列表的最长公共子序列的长度

来自分类Dev

最长公共子序列(LCS)蛮力算法

来自分类Dev

固定长度子串的最长公共子序列

来自分类Dev

最长公共子序列(LCS)蛮力算法

来自分类Dev

最长公共序列的长度Python递归函数

来自分类Dev

Scheme中的LCS(最长公共子序列)

来自分类Dev

最长公共子序列矩阵差分python

来自分类Dev

最长的公共子序列-优化内存

来自分类Dev

最长的公共子序列已优化

来自分类Dev

最长的公共子序列-优化内存

来自分类Dev

c中3+个序列的最长公共子序列

来自分类Dev

c中3+个序列的最长公共子序列

来自分类Dev

N 个序列的最长公共子序列(用于 diff 目的)

来自分类Dev

尤金·迈尔斯(Eugene Myers)的Diff算法:找到“ A”和“ B”的最长公共子序列

来自分类Dev

如何用间隔条件求解LCS(最长公共子序列)

来自分类Dev

了解最长公共子序列算法的时间复杂度

来自分类Dev

查找2个字符串的最长公共子序列?

来自分类Dev

有人可以解释这种“最长公共子序列”算法吗?

来自分类Dev

最长公共子串的方法

来自分类Dev

数组的最长公共前缀和后缀

来自分类Dev

SQL Strip最长公共前缀

来自分类Dev

Leetcode EASY最长公共前缀说明

来自分类Dev

Lucene 搜索最长公共子串

来自分类Dev

如何找到使用较少内存的最长公共子串?