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