4

我试图弄清楚如何将字符串中的字符与字符串中的下一个字符进行比较。例如,如果我有一个字符串:

s = 'vzcbotdebobeggglakyl'

我希望能够将第一个字符与第二个字符进行比较,如果第二个字符大于或等于第一个字符(按字母顺序,a < b、g > e、y = y 等)我想将 1 添加到另一个变量(基本上是一个计数器)。如果不是,我想将计数器重置为 0。基本上对字符串的长度重复整个过程。如果计数器变得大于 maxlen 变量,则将 maxlen 加一(或使 maxlen = sublen)。到目前为止,我的尝试是(而且我认为它正在工作):

s = 'vzcbotdebobeggglakyl'
sublen = 1
maxlen = 0
startnum = 0
for char in s:
    stopnum = startnum + 1
    if stopnum < len(s):
        charone = s[startnum]
        chartwo = s[stopnum]
        if charone <= chartwo:
            sublen += 1
            startnum += 1
            if sublen > maxlen:
                maxlen = sublen
        else:
            startnum +=1
            sublen = 1
    else:
        sublen = 0
print 'Longest substring is', maxlen, 'characters.'

现在,我还想做的是用一行打印出那个字符子串。我已经为此工作了五个小时,但无法做到正确。我尝试了很多不同的事情,以至于我现在基本上比开始时更困惑。在上面的例子中,我想让它说

Longest substring is begggl, which is 6 characters.
4

2 回答 2

2

这不太明显,但似乎有效:

seq = "vzcbotdebobeggglakyl"

import itertools
result = max(
    (
        list(next(sub)) + [b for a, b in sub]
        for ascending, sub in itertools.groupby(zip(seq,seq[1:]), lambda x: x[0] <= x[1])
        if ascending
    ),
    key=len
)

print ''.join(result)
于 2013-10-24T10:32:55.010 回答
1

这个怎么样:

def longest_ascending(s):
    matches = []
    current = [s[0]]
    for index, character in enumerate(s[1:]):
        if character >= s[index]:
            current.append(character)
        else:
            matches.append(current)
            current = [character]
    matches.append(current)
    return "".join(max(matches, key=len))

解释:

  • matches是具有“升序”字符的所有子字符串的列表。
  • current是我们在遍历字符串时构建的升序字符的子字符串。我们从字符串的第一个字符开始。
  • 我们现在逐个字符地遍历剩余的字符串。enumerate()帮助我们跟踪前一个字符的索引(因为枚举开始于0并且我们从第二个字符开始迭代字符串)。
  • 如果当前字符“大于或等于”前一个字符,我们将其添加到当前子字符串并继续。
  • 如果不是,我们将当前子字符串添加到子字符串列表中,并使用当前字符为下一个子字符串播种。
  • 迭代结束后,不要忘记将当前子字符串也添加到列表中。
于 2013-10-24T10:01:12.873 回答