Python 使用for循环和if语句的最长重复子字符串

Python 使用for循环和if语句的最长重复子字符串,python,Python,我在教授python的入门级编程课程中。我被介绍给一个项目的最长重复子串问题,我似乎无法解决它。我在这里寻找了一个解决方案,但我还没有学会后缀树,所以我无法使用它们。到目前为止,我已经做到了: msg = "kalhfdlakdhfklajdf" (anything) for i in range(len(msg)): if msg[i] == msg[i + 1]: reps.append(msg[i]) 这样做的目的是扫描我的字符串msg,并检查计数器是否与序列中

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

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) 我的函数程序在到达列表上的最后一个位置时,由于msg[i+1]越界而总是崩溃

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

您需要使用
len(msg)-1
作为范围,但您的条件会在条件中忽略一个字符,为了更好地理解这一点,您可以在代码中添加另一个条件来检查前面的字符:

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

>>> 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']
还有一个条件:

>>> 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']
您需要使用
len(msg)-1
作为您的范围,但您的条件会在您的条件中省略一个字符,为了获得该条件,您可以在代码中添加另一个条件,同时检查前面的字符:

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

>>> 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']
还有一个条件:

>>> 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']
a) 想想在第一场比赛中发生了什么

例如,给定
abcdeeef
它会看到
msg[4]
匹配
msg[5]
。然后,它会将
msg[4]
附加到Rep。然后
msg[5]
匹配
msg[6]
,并将
msg[5]
附加到
reps
。但是,
msg[6]
msg[7]
不匹配,因此它不会追加
msg[6]
。你缺一个

为了解决这个问题,您需要为每个匹配字符串附加一个额外的值。执行此操作的一个好方法是检查当前匹配的字符是否已存在于
reps
中。如果它只附加当前的一个。如果它没有附加两次

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来实现

对于i(范围(len(msg)-1))

a)想想当它进行第一次匹配时发生了什么

例如,给定
abcdeeef
它会看到
msg[4]
匹配
msg[5]
。然后,它会将
msg[4]
附加到Rep。然后
msg[5]
匹配
msg[6]
,并将
msg[5]
附加到
reps
。但是,
msg[6]
msg[7]
不匹配,因此它不会追加
msg[6]
。你缺一个

为了解决这个问题,您需要为每个匹配字符串附加一个额外的值。执行此操作的一个好方法是检查当前匹配的字符是否已存在于
reps
中。如果它只附加当前的一个。如果它没有附加两次

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来实现


对于我在(范围(len(msg)-1))
对于
groupby
我在@Kasra的出色回答中提到的答案:

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']

对于@Kasra的出色回复中我提到的
groupby
答案:

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']

你是对的。错放的括号。更新,谢谢你的关注。你是对的。错放的括号。更新,谢谢你的关注。