【问题标题】:Finding the largest repeating substring寻找最大的重复子串
【发布时间】:2014-09-19 02:28:10
【问题描述】:

这是我编写的一个函数,它需要一个很长的文本文件。例如包含整本教科书的文本文件。它将找到任何重复的子字符串并输出最大的字符串。但是现在它不起作用,它只是输出我输入的字符串

例如,如果有一个拼写错误,其中重复了整个句子。它会输出那个句子;鉴于它是整个文件中最大的。如果整个段落被输入两次的错字,它将输出该段落。

此算法获取第一个字符,找到任何匹配项,如果找到并且长度最大,则存储子字符串。然后它需要前 2 个字符并重复。然后是前 3 个字符。等等。然后它将重新开始,除了从第二个字符而不是第一个字符开始。然后从第 3 个字符开始一直到回来。

def largest_substring(string):

  length = 0
  x,y=0,0

  for y in range(len(string)):        #start at string[0, ]
    for x in range(len(string)):      #start at string[ ,0]
     substring = string[y:x]          #substring is [0,0] first, then [0,1], then [0.2]... then [1,1] then [1,2] then [1,3]... then [2,2] then [2,3]... etc.
     if substring in string:          #if substring found and length is longest so far, save the substring and proceed.
      if len(substring) > length:
       match = substring
       length = len(substring)

【问题讨论】:

  • 我尽量说清楚。有什么困惑?
  • (你不会偶然发现重复的子字符串构建,比如说,一个后缀数组?)句子或段落不太可能被输入两次而不是被复制(并且不会从原始位置中删除)尝试移动)。

标签: python algorithm parsing substring


【解决方案1】:

我认为您的逻辑在这里有缺陷,因为它总是会返回整个字符串,因为它会检查子字符串是否在整个字符串中,这始终是正确的,因此语句 if substring in string 将始终正确。相反,您需要查找子字符串是否在整个字符串中出现多次,然后更新计数。

这是解决它的蛮力算法示例:-

import re

def largest_substring(string):

    length = 0
    x=0
    y=0

    for y in range(len(string)):       
        for x in range(len(string)):     
            substring = string[y:x]                   
            if len(list(re.finditer(substring,string))) > 1  and len(substring) > length:
                match = substring
                length = len(substring)
    return match


print largest_substring("this is repeated is repeated is repeated")

【讨论】:

  • 抱歉,还有 1 条注释。遇到'('或'*'等特殊符号时似乎会崩溃
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多