[英]Merge two strings to shorten them
我正在解决一个问题,其中我需要合并两个字符串,以便一个字符串可以位于另一个字符串中。 合并的字符串的长度应最短。
例:
str1 = "AABAK"
str2 = "HYUAABA"
merged string = "HYUAABAK"
到目前为止,我已经能够使它以类似的子字符串结尾的字符串工作,但是如果相反,那么我的解决方案将无法正常工作。
失败:
str1 = 'ctaagt'
str2 = 'gcta'
expected answer: gctaagt
解:
def overlap(str1, str2):
l = min(len(str1), len(str2))
for i in range(l, -1, -1):
if str1.endswith(str2[-i:]):
print('overlap ' + str2[-i:])
return str2[-i:]
str1 = "AABAK"
str2 = "HYUAABA"
for i in range(len(str1), -1, -1):
res = overlap(str1[0:i], str2)
if(res):
print('merge ' + str2+str1[i:])
break
我也想知道是否有更好或更清洁的方法来解决此问题。
注意:出于我的测试目的,str1故意短一些。
您可以修改overlap
以返回最终的重叠字符串。 然后,您可以考虑str1
和str2
可能排列方式,并选择带有min
的最终结果,其key
是字符串的长度:
def overlap(str1, str2): # best possible overlap where str1 is 1st and str2 is 2nd
for i in range(len(str1)):
if str2.startswith(str1[i:]):
return str1[:i] + str2
return str1 + str2
str1 = 'ctaagt'
str2 = 'gcta'
result = min(overlap(str1, str2), overlap(str2, str1), key=len)
print(result) # gctaagt
使用上一篇文章中的tobias_k解决方案作为参考,您可以执行以下操作。 然后只需比较a,b和b,a的输出以查看哪个结果字符串较短。
from functools import reduce
a = "AABAK"
b = "HYUAABA"
def overlap(a, b):
return max(i for i in range(len(b)) if b[i - 1] == a[-1] and a.endswith(b[:i]))
reduce(lambda a, b: a + b[overlap(a, b):], [b, a])
您可以非常简单地计算重叠并在相同的循环中进行字符串合并:
def merge(str1, str2):
str2_len = len(str2)
for i in range(str2_len):
# edited to only match correctly
if str1.startswith(str2[i:]):
return str2 + str1[str2_len-i:]
return str2 + str1
>>> str1 =“ AABAK”
>>> str2 =“ HYUAABA”
>>> merge(str1,str2)
'HYUAABAK'
>>> str1 ='ctaagt'
>>> str2 ='gcta'
>>> merge(str1,str2)
'gctaagt'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.