我已经尝试了很多不同的方法来实现这一点,我不知道我做错了什么。
reps=[]
len_charac=0
def longest_charac(strng)
for i in range(len(strng)):
if strng[i] == strng[i+1]:
if strng[i] in reps:
reps.append(strng[i])
len_charac=len(reps)
return len_charac
答案 0 :(得分:5)
简单的解决方案:
def longest_substring(strng):
len_substring=0
longest=0
for i in range(len(strng)):
if i > 0:
if strng[i] != strng[i-1]:
len_substring = 0
len_substring += 1
if len_substring > longest:
longest = len_substring
return longest
遍历字符串中的字符并检查前一个字符。如果它们不同,则将重复字符的数量重置为零,然后递增计数。如果当前计数超过当前记录(存储在longest
中),那么它将成为新的最长记录。
答案 1 :(得分:5)
请记住,在Python中,通常不需要计数循环和索引字符串。还有一个内置max
函数:
def longest(s):
maximum = count = 0
current = ''
for c in s:
if c == current:
count += 1
else:
count = 1
current = c
maximum = max(count,maximum)
return maximum
输出:
>>> longest('')
0
>>> longest('aab')
2
>>> longest('a')
1
>>> longest('abb')
2
>>> longest('aabccdddeffh')
3
>>> longest('aaabcaaddddefgh')
4
答案 2 :(得分:3)
您可以使用itertools.groupby来快速解决这个问题,它会将字符组合在一起,然后您可以按长度对结果列表进行排序,并按如下方式获取列表中的最后一个条目:
from itertools import groupby
print(sorted([list(g) for k, g in groupby('aaabcaaddddefgh')],key=len)[-1])
这应该给你:
['d', 'd', 'd', 'd']
答案 3 :(得分:3)
比较两件事,它们之间有一个关系:
'a' == 'a'
True
比较三件事,有两种关系:
'a' == 'a' == 'b'
True False
结合这些想法 - 反复将事情与他们旁边的事物进行比较,每次链条变短:
'a' == 'a' == 'b'
True == False
False
'b'比较需要减少一次,因为有一个'b'; 'a'比较的两次减少是假的,因为有两个'a'。继续重复直到关系都是False,这就是有多少连续相等的字符。
def f(s):
repetitions = 0
while any(s):
repetitions += 1
s = [ s[i] and s[i] == s[i+1] for i in range(len(s)-1) ]
return repetitions
>>> f('aaabcaaddddefgh')
4
NB。一开始匹配的人物变成了真,只关心将特鲁斯与任何东西进行比较,并在所有的真人都消失而且列表全是法利斯时停止。
它也可以被压缩成递归版本,将深度作为可选参数传递:
def f(s, depth=1):
s = [ s[i] and s[i]==s[i+1] for i in range(len(s)-1) ]
return f(s, depth+1) if any(s) else depth
>>> f('aaabcaaddddefgh')
4
我在尝试别的东西时偶然发现了这一点,但这很令人愉快。
答案 4 :(得分:2)
这有效:
def longestRun(s):
if len(s) == 0: return 0
runs = ''.join('*' if x == y else ' ' for x,y in zip(s,s[1:]))
starStrings = runs.split()
if len(starStrings) == 0: return 1
return 1 + max(len(stars) for stars in starStrings)
输出:
>>> longestRun("aaabcaaddddefgh")
4
答案 5 :(得分:2)
首先,Python不是我的主要语言,但我仍然可以尝试提供帮助。
1)你看起来超出了数组的范围。在最后一次迭代中,您将检查最后一个字符超出的最后一个字符。这通常会导致不确定的行为。
2)你从一个空的reps []数组开始,并比较每个字符以查看它是否在其中。显然,该检查每次都会失败,并且您的追加在if语句中。
答案 6 :(得分:1)
def longest_charac(string):
longest = 0
if string:
flag = string[0]
tmp_len = 0
for item in string:
if item == flag:
tmp_len += 1
else:
flag = item
tmp_len = 1
if tmp_len > longest:
longest = tmp_len
return longest
这是我的解决方案。也许它会帮助你。
答案 7 :(得分:1)
仅针对上下文,这是一种避免处理循环的递归方法:
def max_rep(prev, text, reps, rep=1):
"""Recursively consume all characters in text and find longest repetition.
Args
prev: string of previous character
text: string of remaining text
reps: list of ints of all reptitions observed
rep: int of current repetition observed
"""
if text == '': return max(reps)
if prev == text[0]:
rep += 1
else:
rep = 1
return max_rep(text[0], text[1:], reps + [rep], rep)
试验:
>>> max_rep('', 'aaabcaaddddefgh', [])
4
>>> max_rep('', 'aaaaaabcaadddddefggghhhhhhh', [])
7