簡體   English   中英

合並兩個字符串以縮短它們

[英]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以返回最終的重疊字符串。 然后,您可以考慮str1str2可能排列方式,並選擇帶有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM