舉例:在‘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'}))
