gpt4 book ai didi

python - 许多子序列之间的最长公共(public)序列

转载 作者:行者123 更新时间:2023-11-30 22:41:24 24 4
gpt4 key购买 nike

有趣的标题:)我有一个包含以下内容的文件:

>sequence_40
ABCDABDCABCDBACDBACDBACDBACDABDCDC
ACDCCDCABDCADCADBCACBDCABD
>sequence_41
DCBACDBACDADCDCDCABCDCACBDCBDACBDC
BCDBABABBABACDCDBCACDBACDBACDBACDC
BCDB
...

然后,我有一个函数返回一个字典(称为 dict),该字典返回序列作为键,字符串(组合在一行)作为键的值。序列范围为 40 至 59。我想获取序列字典并返回所有序列中找到的最长公共(public)子序列。设法在 stackoverflow 上找到一些帮助,并编写了一个代码,仅比较该字典中的最后两个字符串,而不是全部:)。这是代码

def longest_common_sequence(s1, s2):
m = [[0] * (1 + len(s2)) for i in range(1 + len(s1))]
longest, x_longest = 0, 0
for x in range(1, 1 + len(s1)):
for y in range(1, 1 + len(s2)):
if s1[x - 1] == s2[y - 1]:
m[x][y] = m[x - 1][y - 1] + 1
if m[x][y] > longest:
longest = m[x][y]
x_longest = x
else:
m[x][y] = 0
return s1[x_longest - longest: x_longest]

for i in range(40,59):
s1=str(dictionar['sequence_'+str(i)])
s2=str(dictionar['sequence_'+str(i+1)])
longest_common_sequence(s1,s2)

如何修改它以获得字典中所有序列之间的公共(public)子序列?谢谢!

最佳答案

编辑:正如@lmcarreiro指出的,子字符串(或子数组子列表)和子序列之间存在相关差异。据我了解,我们在这里都在谈论子字符串,因此我将在回答中使用这个术语。

纪尧姆的回答可以改进:

def eachPossibleSubstring(string):
for size in range(len(string) + 1, 0, -1):
for start in range(len(string) - size + 1):
yield string[start:start+size]

def findLongestCommonSubstring(strings):
shortestString = min(strings, key=len)
for substring in eachPossibleSubstring(shortestString):
if all(substring in string
for string in strings if string != shortestString):
return substring

print findLongestCommonSubstring([
'ABCDABDCABCDBACDBACDBACDBACDABDCDCACDCCDCABDCADCADBCACBDCABD',
'DCBACDBACDADCDCDCABCDCACBDCBDACBDCBCDBABABBABACDCDBCACDBACDBACDBACDCBCDB',
])

打印:

ACDBACDBACDBACD

这更快,因为我返回第一个找到的内容并从最长到最短进行搜索。

基本思想是这样的:取出最短字符串中的每个可能的子字符串(按照从最长到最短的顺序),然​​后看看是否可以在所有其他字符串中找到该子字符串。如果是,则返回它,否则尝试下一个子字符串。

您需要了解生成器。尝试 e。 G。这个:

for substring in eachPossibleSubstring('abcd'):
print substring

print list(eachPossibleSubstring('abcd'))

关于python - 许多子序列之间的最长公共(public)序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42575153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com