此代码查找字符串中最长的字母子字符串(s
)。
letter = s[0]
best = ''
for n in range(1, len(s)):
if len(letter) > len(best):
best = letter
if s[n] >= s[n-1]:
letter += s[n]
else:
letter = s[n]
它大部分时间都有效,但偶尔会给出错误的答案,我很困惑为什么它有时只能起作用。例如:
S = 'maezsibmhzxhpprvx'
它说答案是“hpprv”,而它应该是“hpprvx”。
在另一种情况下,何时
S = 'ysdxvkctcpxidnvaepz'
它给出了答案“cpx”,它应该是“aepz”。
任何人都可以理解为什么会这样做吗?
答案 0 :(得分:3)
您应该移动此支票
if len(letter) > len(best):
best = letter
在循环的其余部分之后
答案 1 :(得分:1)
逻辑几乎没有问题,只是如果letter
在最后一次循环迭代(n == len(s) - 1
)上增长,best
最后一次没有改变。您可以在循环后插入另一个best = letter
部分,或者仔细考虑程序结构,这样您就不会重复了。
答案 2 :(得分:1)
你的日常工作几乎没问题,这里有你们之间的一点比较,固定的和你可能解决的问题:
def buggy(s):
letter = s[0]
best = ''
for n in range(1, len(s)):
if len(letter) > len(best):
best = letter
if s[n] >= s[n - 1]:
letter += s[n]
else:
letter = s[n]
return best
def fixed(s):
letter = s[0]
best = ''
for n in range(1, len(s)):
if s[n] >= s[n - 1]:
letter += s[n]
else:
letter = s[n]
if len(letter) > len(best):
best = letter
return best
def alternative(s):
result = ['' for i in range(len(s))]
index = 0
for i in range(len(s)):
if (i == len(s) - 1 and s[i] >= s[i - 1]) or s[i] <= s[i + 1]:
result[index] += s[i]
else:
result[index] += s[i]
index += 1
return max(result, key=len)
for sample in ['maezsibmhzxhpprvx', 'ysdxvkctcpxidnvaepz']:
o1, o2, o3 = buggy(sample), fixed(sample), alternative(sample)
print "buggy={0:10} fixed={1:10} alternative={2:10}".format(o1, o2, o3)
正如您在版本中看到的,内部循环条件的顺序不好,您应该将第一个条件移动到循环结束。