举例:在‘aabcd‘,查找包含 {a,c}的 最短字符串,结果:abc
解题思路:
网上的方法我没看太明白,所以用了自己的方法。
1.查找a,c的所有位置。
2.对这些位置数字进行组合,只需要max-min,最小,那就是字符串最短了。
知识点:
#eval()字符串求值。eval和exec这两个python中的逆天函数,强大到让人不太放心其安全性
#itertools强大的序列模块,后来专门温习一下。
#*是python中一个赋值的技巧,叫做解包。相信很多人都见过def func(*args, **kwargs)这种写法,
在函数中,*代表不定个数的参数,以tuple的方式传入,**则是以dict的方式。
在使用函数的时候,也可以有类似的方法,调用func(*args)函数时,相当于把一个元组args拆开,当成参数传进函数中。
只是这样做要小心的是,args中含有的元素数量及类型必须跟该函数定义一致,否则会报SyntaxError: invalid syntax语法错误。
#集合是无序的,处理时特别要注意。否则可能会造成切片不正确。
这个是压缩以后的函数,利用解包,可以支持查找多个字符。
def min_str1(str0:str,strs:set): import re,sys from itertools import product strs=sorted(list(strs))#set是无序的,切片是包含首部,不包含尾部的,所以一定要注意顺序。 r=[] for s in strs: r.append([x.start() for x in re.finditer(str(s),str0)]) #查找字符所对应的位置 print(r) min_cha=0 for x in product(*r):#*号为解包,把列表内,或集合内的东西释放出来。 print('结果',x,'差额',max(x)-min(x)) if min_cha==0 or min_cha>max(x)-min(x): min_cha=max(x)-min(x) mt=list(x).copy() #return mt #返回结果是无序,所以切片的时候,特别要注意。 print(min(mt),max(mt)) return str0[min(mt):max(mt)+1] print(min_str1('abcdefa',{'a','c'}))