繁体   English   中英

最长公共序列优化问题

[英]Longest Common Sequence optimization problem

我正在尝试解决在两个字符串之间找到最长公共序列的问题。 我使用了动态编程(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     

谢谢你。

很好的尝试。

请注意,您使用索引i循环通过外部循环中的s1并使用索引j循环通过内部循环中的s2

您应该让s1s2的长度为s21 ,内部循环长度加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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM