Python 包含我需要的所有符号的字符串的最小部分

Python 包含我需要的所有符号的字符串的最小部分,python,string,indexing,slice,Python,String,Indexing,Slice,假设我有一个很长的字符串,它是这样的: s = '-----1---------1----2----------4----------------1--------------2---------2--3------1---3------ and so on' 我知道“1”、“2”、“3”和“4”都可以在字符串中找到。但是有没有办法在包含这四个数字的字符串中找到尽可能短的跨度呢?您可以这样做: s=--1--1--2--4--1--2--2-3--1--3--- s=s带- seqs=[] 对

假设我有一个很长的字符串,它是这样的:

s = '-----1---------1----2----------4----------------1--------------2---------2--3------1---3------ and so on'
我知道“1”、“2”、“3”和“4”都可以在字符串中找到。但是有没有办法在包含这四个数字的字符串中找到尽可能短的跨度呢?

您可以这样做:

s=--1--1--2--4--1--2--2-3--1--3--- s=s带- seqs=[] 对于i,c,在枚举中: 如果[1,2,3,4]中的c: 序号= nums=[1,2,3,4] 对于s[i:]中的c2: 序号+=c2 如果c2以nums表示: nums.removec2 如果lennums==0: 附件 打破 printminseqs,key=len
您可以通过在字符串中查找最小和最大相关索引来实现:

import itertools
s = '-----1---------1----2----------4----------------1--------------2---------2--3------1---3------ and so on'

def consequtive_sub_lists(l): 
    sublists = []
    for iter, item in enumerate(l):
        sublists.append([item])
        cur_sublist = [item]
        for idx in range(iter+1, len(l)):
            cur_sublist.append(l[idx])
            sublists.append(cur_sublist.copy())
    return sublists
strings_in = ['1', '2', '3','4']
sublists = [list(group) for key, group in itertools.groupby(s, lambda x: x not in strings_in)]
count_substrings = [len(item) if not any(True if m_str in item else False for m_str in strings_in) else item for item in sublists]
orig_sublists = count_substrings.copy()

indices = [count_substrings.index([item]) for item in strings_in]
all_mins = []
start_idx = 0
while (len(indices)!=0) and len(indices) == len(strings_in):
    cur_min = sum([num for num in count_substrings[min(indices):max(indices)+1] if isinstance(num, int)])
    all_mins.append((cur_min, [sum([num if isinstance(num,int) else 1 for num in orig_sublists[:item+start_idx]]) for item in indices]))
    if len(indices) == len(strings_in):
        start_idx += min(indices) + 1
        print()
    else:
        break
    count_substrings = count_substrings[2:]
    indices = [count_substrings.index([item]) for item in strings_in if [item] in count_substrings]
tot_min = min(all_mins)
print(f'min chars:{tot_min[0]}, minimum substring: {s[min(tot_min[1]):max(tot_min[1])+1]}')
输出:

min chars:41, minimum substring: 4----------------1--------------2---------2--3
重要的是,Silion假设字符串中没有相邻字符,如果可以接受,则必须修改解决方案

有点适应我的回答,
为了获得更有效的解决方案,正如在同一链接中所建议的,您可以尝试对Kadane的算法进行调整。

是的。但是你试过什么并遇到了一个具体的问题吗?没有,不幸的是我没有,因为我不知道从哪里开始,也不知道从哪里问这个问题。你的问题的答案是正确的。4---1---2---2-3包含了所有的数字,比你的脚本打印的要短。一开始我不明白,如您所见,编辑后的答案中的修复使解决方案更加复杂。在等待答案之前,先进行下一轮投票,这可不太好。对于一个简单的问题,它看起来太复杂了。我真的不认为这是一个简单的问题,我还建议你查看一个已知的算法,但需要更多的修改。总的来说,把我的解决方案作为一个建议,它很简单。像我一样,用10行基本代码就可以解决这个问题。我认为这个例子只包括了中间部分,只是为了简化更复杂的情况