我试图按字母顺序计算字符串的最长长度
s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
if s[i] <= s[i+1]:
current += 1
else:
if current > longest:
longest = current
current = 0
i += 1
print longest
对于这个特定的字符串,'Current'以正确的长度4结束,但从不修改最长。
编辑:以下代码现在遇到错误
s = 'abcv'
current = 1
biggest = 0
for i in range(len(s) - 1):
while s[i] <= s[i+1]:
current += 1
i += 1
if current > biggest:
biggest = current
current = 0
print biggest
似乎我的逻辑是正确的,但我遇到某些字符串的错误。 :(
虽然互联网上有代码来源可以打印最长的字符串,但我似乎无法找到如何打印最长的字符串。
答案 0 :(得分:1)
break
将跳到循环后面(作为for
语句的缩进。continue
将跳转到循环开始并进行下一次迭代
else:
语句中的逻辑不起作用 - 您需要将其缩进一次。
if s[i] <= s[i+1]:
检查“实际字符数是否小于或等于下一个字符” - 如果是这种情况,则需要增加内部计数器并设置最长时间
你可能会遇到if s[i] <= s[i+1]:
的问题 - 你这样做直到len(s)-1
。 "jfjfjf"
是len("jfjfjf") = 6
- 你会从0迭代到5 - 但if访问s[5]
和s[6]
这就是项目。
一种不同的方法,无需覆盖显式索引并分为两个职责(获取字母子字符串列表,首先排序最长):
# split string into list of substrings that internally are alphabetically ordered (<=)
def getAlphabeticalSplits(s):
result = []
temp = ""
for c in s: # just use all characters in s
# if temp is empty or the last char in it is less/euqal to current char
if temp == "" or temp[-1] <= c:
temp += c # append it to the temp substring
else:
result.append(temp) # else add it to the list of substrings
temp = "" # and clear tem
# done with all chars, return list of substrings
return result
# return the splitted list as copy after sorting reverse by length
def SortAlphSplits(sp, rev = True):
return sorted(sp, key=lambda x: len(x), reverse=rev)
splitter = getAlphabeticalSplits("akdsfabcdemfjklmnopqrjdhsgt")
print(splitter)
sortedSplitter = SortAlphSplits(splitter)
print (sortedSplitter)
print(len(sortedSplitter[0]))
输出:
['ak', 's', 'abcdem', 'jklmnopqr', 'dhs']
['jklmnopqr', 'abcdem', 'dhs', 'ak', 's']
9
这个返回分裂数组+按长度降序对它们进行排序。在关键环境中,这会花费更多的内存,因为您只缓存一些数字,而另一种方法填充列表并将其复制到已排序的列表中。
要解决您的代码索引问题,请稍微改变您的逻辑: 从第二个字符开始,测试前一个字符是否小于此值。这样你就可以用之前的那个来检查这个字符
s = 'abcvabcdefga'
current = 0
biggest = 0
for i in range(1,len(s)): # compares the index[1] with [0] , 2 with 1 etc
if s[i] >= s[i-1]: # this char is bigger/equal last char
current += 1
biggest = max(current,biggest)
else:
current = 1
print biggest
答案 1 :(得分:0)
你必须编辑else语句。因为考虑情况,其中电流刚刚超过最长,即从current = 3 and longest =3
开始,通过递增自身,电流变为4。 现在,您仍然希望它进入if current > longest
声明
s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
if s[i] <= s[i+1]:
current += 1
#else:
if current > longest:
longest = current
current = 0
i += 1
longest = current
print longest
答案 2 :(得分:0)
在循环结束时, current 是最后一个子字符串的升序长度。将其分配给最长是不对的,因为升序中的最后一个子串不一定是最长的。
循环后longest=max(current,longest)
代替longest=current
,应该为你解决。
编辑:^在编辑之前是。您只需要在for循环后添加longest=max(current,longest)
,原因相同(不考虑最后一个升序子字符串)。像这样:
s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
if s[i] <= s[i+1]:
current += 1
else:
if current > longest:
longest = current
current = 0
i += 1
longest=max(current,longest) #extra
print longest
答案 3 :(得分:0)
使用while条件循环,然后您可以轻松定义循环完成的条件。 如果你想长期使用QualityCode: 虽然循环比休息更好,但因为你在一个地方看到了循环条件。在循环体之间识别简单的断裂往往更糟糕。
答案 4 :(得分:0)
当标签空间之后没有代码时,循环结束,所以从技术上讲,你的循环已经结束