百度面試題:字符串中查找包含某些字符的集合


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM