【问题标题】:Repeating non-overlapping substrings重复不重叠的子串
【发布时间】:2019-10-07 11:55:25
【问题描述】:

这是寻找最长的重复子串代码(来源:geeksforgeeks):

def longestRepeatedSubstring(str): 

    n = len(str) 
    LCSRe = [[0 for x in range(n + 1)] 
                for y in range(n + 1)] 

    res = "" # To store result 
    res_length = 0 # To store length of result 

    # building table in bottom-up manner 
    index = 0
    for i in range(1, n + 1): 
        for j in range(i + 1, n + 1): 

            # (j-i) > LCSRe[i-1][j-1] to remove 
            # overlapping 
            if (str[i - 1] == str[j - 1] and
                LCSRe[i - 1][j - 1] < (j - i)): 
                LCSRe[i][j] = LCSRe[i - 1][j - 1] + 1

                # updating maximum length of the 
                # substring and updating the finishing 
                # index of the suffix 
                if (LCSRe[i][j] > res_length): 
                    res_length = LCSRe[i][j] 
                    index = max(i, index) 

            else: 
                LCSRe[i][j] = 0

    # If we have non-empty result, then insert 
    # all characters from first character to 
    # last character of string 
    if (res_length > 0): 
        for i in range(index - res_length + 1, 
                                    index + 1): 
            res = res + str[i - 1] 

    return res 

# Driver Code 
if __name__ == "__main__": 

    str = "geeksforgeeks"
    print(longestRepeatedSubstring(str)) 

# This code is contributed by ita_c 

如何修改它以获得较短的重复非重叠子串,以长度为 x 的子串开始并以最长的子串结束? (尝试了各种更改,但从未得到正确的结果)。

【问题讨论】:

  • 您能否提供输入和预期输出的示例?它将帮助用户回答
  • How can it be modified to obtain also the shorter 最短的总是长度为 1 或 0(空字符串理论上是子字符串)。你对“更短”的理解是什么?你想要第二长的吗?或者任何字符串?或者如果有两个相同(最长)的长度,让它们都得到而不是最长的?
  • 应找到所有长度为 x 和更长(最长)的重复子字符串。重复次数无关紧要。不能有任何重叠,也不能有较长子串的子串。 IE。结果表中的所有子字符串都不与任何其他子字符串共享任何元素。示例:x=3,字符串:47358917948809837074317946984339473589669843698370880,结果:880//1794//69843//98370//473589

标签: python substring


【解决方案1】:

假设这是某种编程练习,我不想提供代码本身。我会提供提示。


如何修改它以获得较短的重复非重叠子串,以长度为 x 的子串开始并以最长的子串结束? (尝试了各种更改,但从未得到正确的结果)。

如果我理解正确,请告诉我...

你想得到所有不重叠的最长子串,对吧?

第一个问题:不重叠意味着最长的子串可以切割其他长子串。反之亦然。从最长到 x 搜索,而不是从 x 到最长搜索。

第二个问题:我们更关心什么 - 长度或字符串数​​量?


如果我们只关心当前时间最长的,您可以:

  1. 找到最长的匹配项
  2. 如果它的长度比想要的长x,保存它(否则退出)
  3. 从字符串中删除所有出现的最长字符串(?如果字符串有 3 次最长的重复,而不是 2 次?)保留一些分隔符(因为例如abbcacbb 具有最长的子字符串bb - 只需删除它就会产生acac,给出ac,这是错误的)
  4. 重复

这基本上是您需要“翻译”成真实代码的伪代码。使用while 循环。 ;)

您不需要修改给定的函数 - 正如您所看到的,第 1 点按原样使用它。您只需要从对该函数的多次调用中获取结果。 ;)

【讨论】:

  • 应找到所有长度为 x 和更长(直到最长)的重复子字符串。重复次数无关紧要。不能有任何重叠,也不能有较长子串的子串。 IE。结果表中的所有子字符串都不与任何其他子字符串共享任何元素。示例:字符串:47358917948809837074317946984339473589669843698370880,结果:880//1794//69843//98370//473589
  • There must not be any overlapping and no substrings of a longer substring - 正如我所说,从最长到 x,而不是相反。始终删除当前最长的并在那里放置一个占位符(如第三点中的示例)没有固定重叠。 ;) 尝试实现它。 ;)
猜你喜欢
  • 2020-04-27
  • 2014-11-01
  • 2017-03-11
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多