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]一旦到达列表中的最后一个位置就越界而崩溃。
本质上,我希望我的程序查找重复,将它们附加到一个列表中,在该列表中计算出最高的重复字符并将其返回给用户。
您需要使用
根据您的条件,您将在
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'] |
对于
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的子字符串。依我的理解,
a)想想第一场比赛时发生了什么。
例如,假设
为了解决这个问题,您需要为每个匹配字符串额外附加一个匹配项。一个很好的方法是检查当前匹配的字符是否已经存在于
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来完成。