京东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)







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值