关于python:使用for循环和if语句的最长重复子字符串

Longest repeating substring using for-loops and if-statements

我在一个入门级的编程课上教Python。我被介绍给一个项目中最长的重复子串问题,我似乎不能破解它。我在这里寻找了一个解决方案,但我还没有学习后缀树,所以我不能使用它们。到目前为止,我已经来到这里:

1
2
3
4
5
msg ="kalhfdlakdhfklajdf" (anything)

for i in range(len(msg)):
    if msg[i] == msg[i + 1]:
        reps.append(msg[i])

这将扫描我的字符串msg,并检查计数器是否匹配序列中的下一个字符。如果字符匹配,它会将msg[i]附加到"reps"列表中。我的问题是:a)我创建的函数总是附加一个小于重复量的值,并且b)我的函数程序总是因为消息[i+1]一旦到达列表中的最后一个位置就越界而崩溃。

本质上,我希望我的程序查找重复,将它们附加到一个列表中,在该列表中计算出最高的重复字符并将其返回给用户。


您需要使用len(msg)-1作为您的范围,但是您的条件将在您的条件中省略一个字符,为了获得该条件,您可以在代码中添加另一个条件来检查前面的字符:

根据您的条件,您将在reps中有8个h,直到在msg中有9个:

1
2
3
4
5
6
7
8
>>> msg ="kalhfdlakdhhhhhhhhhfklajdf"
>>> reps = []
>>> for i in range(len(msg)-1):
...     if msg[i] == msg[i + 1]:
...         reps.append(msg[i])
...
>>> reps
['h', 'h', 'h', 'h', 'h', 'h', 'h', 'h']

还有另一个条件:

1
2
3
4
5
6
7
>>> reps=[]
>>> for i in range(len(msg)-1):
...     if msg[i] == msg[i + 1] or msg[i] == msg[i - 1]:
...         reps.append(msg[i])
...
>>> reps
['h', 'h', 'h', 'h', 'h', 'h', 'h', 'h', 'h']

对于groupby的回答,我提到@kasra的出色回应:

1
2
3
4
5
6
7
8
9
10
11
from itertools import groupby

msg ="kalhfdlakdhhhhhhhhhfklajdf"

maxcount = 0
for substring in groupby(msg):
    lett, count = substring[0], len(list(substring[1]))
    if count > maxlen:
        maxcountlett = lett
        maxcount = count
result = [maxcountlett] * maxlen

但请注意,这只适用于长度为1的子字符串。依我的理解,msg = 'hahahaha'应该给['ha', 'ha', 'ha', 'ha']


a)想想第一场比赛时发生了什么。

例如,假设abcdeeef,它可以看到msg[4]msg[5]匹配。然后,它将msg[4]附加到reps。然后,msg[5]msg[6]匹配,将msg[5]附加到reps上。但是,msg[6]msg[7]不匹配,因此不附加msg[6]。你很矮。

为了解决这个问题,您需要为每个匹配字符串额外附加一个匹配项。一个很好的方法是检查当前匹配的字符是否已经存在于reps中。如果它只附加当前的。如果它不附加两次。

1
2
3
4
5
6
if msg[i] == msg[i+1]
    if msg[i] in reps
        reps.append(msg[i])
    else
        reps.append(msg[i])
        reps.append(msg[i])

b)您需要确保不超出您的界限。这可以通过从你的射程上取下1来完成。

for i in (range(len(msg)-1))