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

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

 

posted on 2018-01-01 00:13  guangzhao17  阅读(1695)  评论(0编辑  收藏  举报