【问题标题】:Longest Common Sequence optimization problem最长公共序列优化问题
【发布时间】:2020-04-18 14:37:21
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您能否将您的问题扩展为minimal reproducible example?还有,什么是“DP”?
  • @Alex DP 是动态编程。当然,首先我消除了所有相同的第一个和最后一个元素,在 nr 中保留这些元素的数量。之后,我使用en.wikipedia.org/wiki/Hunt%E2%80%93Szymanski_algorithm 这个算法的迭代版本,而不是使用矩阵,我只使用我交换的两行(row1 和 row2)。我保留相同元素的数量,最后添加我计算的 nr 和开头
  • 您应该使用这些详细信息更新您的问题。将 cmets 添加到代码中并提供示例输入和相应的输出。那是minimal reproducible example
  • 您确定问题是超时吗?我注意到您的实现中有几个错误。

标签: python algorithm optimization dynamic-programming longest-substring


【解决方案1】:

很好的尝试。

请注意,您使用索引i 循环外循环中的s1 和索引j 循环内循环中的s2

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

【讨论】:

  • 非常感谢,我能够通过从 Py3 更改为 PyPy3 来解决这个问题,并且它在我的第一个实现和你带来的更改中都运行良好。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 2016-11-12
  • 2011-03-01
  • 2014-07-23
  • 2011-02-25
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多