Python 使用for循环和if语句的最长重复子字符串
我在教授python的入门级编程课程中。我被介绍给一个项目的最长重复子串问题,我似乎无法解决它。我在这里寻找了一个解决方案,但我还没有学会后缀树,所以我无法使用它们。到目前为止,我已经做到了: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,并检查计数器是否与序列中
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']
。你是对的。错放的括号。更新,谢谢你的关注。你是对的。错放的括号。更新,谢谢你的关注。