如何解决如何按字母顺序在列表中取出最长的子串?
例如,初始列表L = [“ by”,“ article”,“ circle”,“ for”,“ line”,“ dance”,“ effort”]],而我想取出[[结果”,“圆圈”,“用于”,“线”]。因为L中的第一个alpha是(b,a,c,f,l,d,e)并且(a,c,f,l)的结果比(d,e)更长,所以结果是[ “文章”,“圆圈”,“用于”,“线”]。如何修复我的代码?我是新手,所以我对sorted()和嵌套循环感到困惑。
def find_longest_consisting(test_case):
if not test_case:
return []
result = []
for i in range(len(test_case)):
for j in range(i + len(result) + 1):
substring = test_case[i:j]
if len(substring) != (j - i):
break
if sorted(substring) == list(substring):
result = substring
return result
test_cases = ["by","article","circle","for","line","dance","effort"]
test_result = find_longest_consisting(test_cases)
print(test_result)
解决方法
最快的方法是维护一个“最长”列表,并在遇到顺序更改时将其长度与当前子列表进行比较,如果更长,则将当前子列表分配给最长的列表。只需对列表进行一次迭代即可获得结果。
def longest_group(lst):
longest = []
current = lst[:1]
for i in range(1,len(lst)):
if lst[i][0] <= lst[i-1][0]:
if len(current) > len(longest):
longest = current
current = [lst[i]]
else:
current.append(lst[i])
if len(current) > len(longest):
longest = current
return longest
print(longest_group(["by","article","circle","for","line","dance","effort"]))
print(longest_group(["zoo","slack","egg"]))
输出:
['article','circle','for','line']
['zoo']
对于您的["by","effort"]
列表,这比对列表中的所有组合进行排序要快10倍。参见https://rextester.com/JEJOAE73859进行演示。
使用自己的嵌套循环检查不同的子集的一种简单替代方法是使用itertools.combinations
:
from itertools import combinations
def longest_group(lst):
return max((
lst[a:b]
for a,b in combinations(range(len(lst)+1),2)
if sorted(lst[a:b]) == lst[a:b]
),key=len) if lst else lst
如果速度比简单性更重要,那么快速版本将遍历列表并跟踪与最长排序切片对应的范围:
def longest_group(lst):
a,b,i = 0,0
for j,e in enumerate(lst[1:]):
if e < lst[j]:
if j - i > b - a:
a,b = i,j
i = j + 1
if len(lst) - i > b - a + 1:
a,len(lst)
return lst[a:b+1]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。