【问题标题】:Merge two strings to shorten them合并两个字符串以缩短它们
【发布时间】:2018-11-23 22:42:34
【问题描述】:

我正在解决一个问题,我需要合并两个字符串,以便一个字符串可以在另一个字符串中。合并的字符串应该是最短的长度。

例子:

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 故意较短。

【问题讨论】:

  • 请修正你的缩进

标签: python string algorithm


【解决方案1】:

您可以修改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

【讨论】:

    【解决方案2】:

    使用tobias_k's solution from a previous post 作为参考,您可以执行以下操作。然后只需比较 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])
    

    【讨论】:

      【解决方案3】:

      您可以非常简单地计算重叠并在相同的循环中合并字符串:

      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"

      >>> 合并(str1,str2)

      'HYUAABAK'


      >>> str1 = 'ctaagt'

      >>> str2 = 'gcta'

      >>> 合并(str1,str2)

      'gctaagt'

      【讨论】:

      • 这里的问题是如果str1 = 'gcta'str2 = 'ctaagt'这会给出错误的结果。
      • 对不起,我昨天很着急!我弄错的一件事是,不是只检查str2 子字符串是否在str1 中,而是应该检查子字符串是否在str1 的开头。我将编辑答案以包含此内容。
      • 另外,我假设您想要合并两个字符串,即使它们不重叠,您可能不想这样做。您可以通过修改返回来更改此设置。
      猜你喜欢
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2019-10-04
      相关资源
      最近更新 更多