找到最长重复的长度?

时间:2015-06-27 02:46:13

标签: python python-3.x

我已经尝试了很多不同的方法来实现这一点,我不知道我做错了什么。

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

8 个答案:

答案 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