【问题标题】:Longest Prefix That is Also a Substring in Second String也是第二个字符串中的子字符串的最长前缀
【发布时间】:2020-05-14 22:33:23
【问题描述】:

这段代码(改编自前缀-后缀代码)对于较大的语料库来说非常慢:

s1 = 'gafdggeg' s2 = 'adagafrd'

输出:gaf

def pref_also_substr(s):
    n = len(s)
    for res in range(n, 0, -1):
        prefix = s[0: res]
        if (prefix in s1):
            return res

    # if no prefix and string2 match occurs

    return 0

任何有效的替代方案?

【问题讨论】:

  • 如果问题的主要大小是s2 的长度,而s1 相对较小,您可以使用正则表达式搜索有效地解决此问题,方法是从s1 构建一个正则表达式,例如它将匹配s1 的任何前缀。如果你有兴趣,我可以告诉你如何做到这一点。但是,如果s1 的长度仅受O(len(s2)) 的约束,那么这种方法不是最优的,您将需要手动编码。无论如何,问题可以在线性时间内解决(在len(S2)),这比您当前的解决方案要好得多。
  • 这看起来像是Longest common substring problem 的更简单(或受限)版本,为此存在有效的基于后缀树的解决方案。
  • 子串的最小长度是多少?

标签: python substring longest-prefix


【解决方案1】:

我有另一种方法来解决这个问题。首先,您可以找到s2 的所有子字符串,并将字典d 中的键替换为最大大小。

s2 = "'adagafrd'"
# Get all substrings of string 
# Using list comprehension + string slicing 
substrings = [test_str[i: j] for i in range(len(test_str))
       for j in range(i + 1, len(test_str) + 1)]

现在您可以使用startswith() 函数从该子字符串列表中检查最长前缀并比较子字符串的大小。

s1 = 'gafdggeg'
d={}
for substring in substrings:
    if s1.startswith(substring):
        if not d:
            d[substring]=len(substring)
        else:
            if len(substring)>list(d.values())[0]:
                d={}
                d[substring]=len(substring)
print(d)

输出:

{'gaf': 3}

【讨论】:

    【解决方案2】:
    def f(s1, s2):
        for i in range(len(s1)):
            i += 1
            p = s1[:i]
            if p in s2:
                s2 = s2[s2.index(p):]
            else: 
                return i - 1
    

    检查从长度 1 开始的前缀。 如果找到前缀,则丢弃创建的前缀后面的字符并继续搜索。

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2019-05-03
      • 1970-01-01
      • 2021-06-08
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2018-12-02
      相关资源
      最近更新 更多