京東2019校招 筆試1:相似字串
阿新 • • 發佈:2018-12-09
題目: 兩字串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)