python - 最长公共序列优化问题
问题描述
我正在尝试解决在两个字符串之间找到最长公共序列的问题。我使用了动态编程(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
谢谢你。
解决方案
很好的尝试。
请注意,您使用 index在外循环i
中循环,并在内部循环中使用 index 循环。s1
j
s2
你应该让s1
和s2
有加号的长度s2
,1
内环长度加号1
。
此外,您在实现中错误地使用j
访问s1
和i
访问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
推荐阅读
- vba - Access中的条件格式与VBA中的函数
- arrays - 在哈希数组中,如何删除另一个键中已经存在的值?
- gcc - 在新机器上构建 Eclipse 项目。GNU Linker 找不到库
- laravel - 以laravel形式编辑时如何在下拉列表中显示选定的值?
- microsoft-graph-api - 如何删除与架构定义相关的自定义数据?
- c++ - 如何在 C++ 程序中调用 matlab 中编写的机器学习算法?
- vue.js - 在 Vue 中使用下拉菜单更改文本颜色
- sqlite - 是否可以使用 github 托管支持 sqlite 数据库的 Web 应用程序?
- javascript - 如何将 CustomElementRegistry 复制到子窗口?
- database - 检查数据库连接的有效方法?