Python字计数器

我在学校学习Python 2.7课程,他们告诉我们要创建以下程序:

假定s是一串小写字符。

编写一个程序,以字母顺序打印s中最长的子字符串。

例如,如果s = azcbobobegghakl,那么你的程序应该打印

字母顺序中最长的子字符串是:beggh

在关系的情况下,打印第一个子字符串。

例如,如果s ='abcbcd',那么你的程序应该打印

字母顺序中最长的子字符串是:abc

我写了下面的代码:

s = 'czqriqfsqteavw'

string = ''

tempIndex = 0
prev = ''
curr = ''

index = 0
while index < len(s):
    curr = s[index]
    if index != 0:
        if curr < prev:
            if len(s[tempIndex:index]) > len(string):
               string = s[tempIndex:index]
            tempIndex=index
        elif index == len(s)-1:
            if len(s[tempIndex:index]) > len(string):
               string = s[tempIndex:index+1]
    prev = curr
    index += 1

print 'Longest substring in alphabetical order is: ' + string

老师还给了我们一系列测试字符串来尝试:

onyixlsttpmylw  
pdxukpsimdj  
yamcrzwwgquqqrpdxmgltap  
dkaimdoviquyazmojtex  
abcdefghijklmnopqrstuvwxyz  
evyeorezmslyn  
msbprjtwwnb  
laymsbkrprvyuaieitpwpurp  
munifxzwieqbhaymkeol   
lzasroxnpjqhmpr    
evjeewybqpc   
vzpdfwbbwxpxsdpfak    
zyxwvutsrqponmlkjihgfedcba  
vzpdfwbbwxpxsdpfak     
jlgpiprth  
czqriqfsqteavw 

他们都工作得很好,除了最后一个产生以下答案:

字母顺序中最长的子字符串是:cz

但它应该说:

字母顺序中最长的子字符串是:avw

我已经检查了上千次代码,并没有发现任何错误。 你可以帮我吗?


这些行:

        if len(s[tempIndex:index]) > len(string):
           string = s[tempIndex:index+1]

不同意。 如果新的最佳字符串是s[tempIndex:index+1]那么这就是你应该比较if条件长度的字符串。 将它们改为彼此同意可以解决问题:

        if len(s[tempIndex:index+1]) > len(string):
           string = s[tempIndex:index+1]

我看到user5402已经很好地回答了你的问题,但是这个特殊的问题让我很感兴趣,所以我决定重新编写你的代码。 :)下面的程序基本上使用与您的代码相同的逻辑,并进行了一些小改动。

在实际中避免使用索引并直接在字符串(或其他容器对象)的内容上进行迭代被认为是更加Pythonic。 这通常会使代码更易于阅读,因为我们不必跟踪索引和内容。

为了访问字符串中的当前字符和前一个字符,我们将输入字符串的两个副本压缩在一起,其中一个副本通过在开始处插入空格字符来抵消。 我们还会在另一个副本的末尾附加一个空格字符,以便在输入字符串末尾出现最长的有序子序列时,我们不必进行特殊处理。

#! /usr/bin/env python

''' Find longest ordered substring of a given string 

    From http://stackoverflow.com/q/27937076/4014959
    Written by PM 2Ring 2015.01.14
'''

data = [
    "azcbobobegghakl",
    "abcbcd",
    "onyixlsttpmylw",
    "pdxukpsimdj",
    "yamcrzwwgquqqrpdxmgltap",
    "dkaimdoviquyazmojtex",
    "abcdefghijklmnopqrstuvwxyz",
    "evyeorezmslyn",
    "msbprjtwwnb",
    "laymsbkrprvyuaieitpwpurp",
    "munifxzwieqbhaymkeol",
    "lzasroxnpjqhmpr",
    "evjeewybqpc",
    "vzpdfwbbwxpxsdpfak",
    "zyxwvutsrqponmlkjihgfedcba",
    "vzpdfwbbwxpxsdpfak",
    "jlgpiprth",
    "czqriqfsqteavw",
]


def longest(s):
    ''' Return longest ordered substring of s
        s consists of lower case letters only.
    '''
    found, temp = [], []
    for prev, curr in zip(' ' + s, s + ' '):
        if curr < prev:
            if len(temp) > len(found):
                found = temp[:]
            temp = []
        temp += [curr]
    return ''.join(found)


def main():
    msg = 'Longest substring in alphabetical order is:'
    for s in data:
        print s
        print msg, longest(s)
        print


if __name__ == '__main__':
    main()  

产量

azcbobobegghakl
Longest substring in alphabetical order is: beggh

abcbcd
Longest substring in alphabetical order is: abc

onyixlsttpmylw
Longest substring in alphabetical order is: lstt

pdxukpsimdj
Longest substring in alphabetical order is: kps

yamcrzwwgquqqrpdxmgltap
Longest substring in alphabetical order is: crz

dkaimdoviquyazmojtex
Longest substring in alphabetical order is: iquy

abcdefghijklmnopqrstuvwxyz
Longest substring in alphabetical order is: abcdefghijklmnopqrstuvwxyz

evyeorezmslyn
Longest substring in alphabetical order is: evy

msbprjtwwnb
Longest substring in alphabetical order is: jtww

laymsbkrprvyuaieitpwpurp
Longest substring in alphabetical order is: prvy

munifxzwieqbhaymkeol
Longest substring in alphabetical order is: fxz

lzasroxnpjqhmpr
Longest substring in alphabetical order is: hmpr

evjeewybqpc
Longest substring in alphabetical order is: eewy

vzpdfwbbwxpxsdpfak
Longest substring in alphabetical order is: bbwx

zyxwvutsrqponmlkjihgfedcba
Longest substring in alphabetical order is: z

vzpdfwbbwxpxsdpfak
Longest substring in alphabetical order is: bbwx

jlgpiprth
Longest substring in alphabetical order is: iprt

czqriqfsqteavw
Longest substring in alphabetical order is: avw

指数是你的朋友。 下面是该问题的简单代码。

longword = ''

for x in range(len(s)-1):
    for y in range(len(s)+1):
        word = s[x:y]
        if word == ''.join(sorted(word)):
            if len(word) > len(longword):
                longword = word
print ('Longest substring in alphabetical order is: '+ longword)                
链接地址: http://www.djcxy.com/p/20313.html

上一篇: Python word counter

下一篇: Counting characters in a Character array