1. 程式人生 > >京東2019校招 筆試1:相似字串

京東2019校招 筆試1:相似字串

題目: 兩字串X與Y,如果存在a-z的某個排列組合,把X的第一個字元全換成a,第二個字元全換成b,就能把X變成Y,就表明兩字串相似。 例如 xax與 aba,把z替換成a,a換成b就一樣了,表明相似。 求一個目標字串X,用來匹配的字串Y,求X的子串裡有多少和Y相似的,輸出相似字串的個數。 輸入是X和Y,輸出個數 輸入:

ababcdcbbab
xyx

輸出:

4

思路: 一個長度為Y字串大小的滑動視窗從X開始一直滑到結尾,得到所有長度與Y相等的子串,形成一個list,一定要用List,而且千萬不要去重!!!!去重就會少字串,我就是因此沒通過T_T 對每個子串,進行一次相似判斷。給子串建立一個字典,記錄所有不重複字元作為字典的鍵,鍵的值是字元在子串裡出現的位置。比如xyy,字典{x:[0],y:[1,2]},接著用一個list把字典的值加在一起{[0],[1,2]} 如果兩個子串的位置list相同,就判斷兩字串相似。

def dicfuc(sb):
    bdic={}
    for i in range(len(sb)):
        if(sb[i] not in bdic):
            bdic[sb[i]]=[i]
        else:
            bdic[sb[i]].extend([i])
    return bdic
def xiangsi(sa,sb):
    bdic=dicfuc(sb)
    lb=[]
    la=[]
    adic =dicfuc(sa)
    for k in bdic:
        lb.append(bdic[k])
    for
k in adic: la.append(adic[k]) alen=len(adic) blen = len(bdic) if(alen!=blen): return False else: if(sorted(la)==sorted(lb)): return True else: return False s=input() T=input() # s='ababcdcbbab' # T='xyx' ww =[] lenT=len(T) lenS=len(s) for
i in range(lenS-lenT+1): ww.append(s[i:i+lenT]) print(ww) count=0 for sitem in ww: if(xiangsi(sitem, T)): count=count+1 print(count)