字节跳动第四批笔试题第3题

字节跳动第四批笔试题第3题

题目:

输入2组字符串,分别是字符串S,T,如果有该子串则输出该子串,否则输出空串。

输入:ADSKBACWDWKDEH

输入:ABCD

输出:BACWD

题目的意思

输入字符串 **S** 和 字符串 **T**	
然后输出的结果是   字符串**S** 中 包含字符串**T**中所有子字符且长度最短的子串

比如
   **ADSKBACWDWKDEH**  包含**ABCD** 输出结果 **BACWD**	
   **ACCAAJJDHJJKDJ**  包含**CAD**  输出结果 **CAAJJD**

思路


  1. 首先得到 T 中所有 子字符 在 S 中的下标

  1. 因为我们不知道 T 中就多少个 子字符 所以要创建一个类 属性就是一个空列表
    存放该 字符 的所有下标

  1. 得到下标列表后 关键的一步

    比如
    S = 'AHCJKBANCNBA’
    T = 'ABC’
    A 的索引列表 是 [0,6,11]
    B 的索引列表 是 [5,10]
    C 的索引列表 是 [2,6]

    我们把 A 的所有索引 分别与 B C 的所有索引进行连接 比如
    [0-5 , 0-10 , 0-2 , 0-6]
    [6-5 , 6-10 , 6-2 , 6-6]
    [11-5 , 11-10 , 11-2 , 11-6]
    再把 B 的所有索引 与 C 的所有索引进行连接

    获得字符串 S 中 子串的 头 跟 尾 都是字符串 T 中的子字符
    比如 索引连接中的 0-5 对应 字符串 S 中的 AHCJKB
    再判断 这些子串 中是否包含 除头尾以外的剩下子字符
    全部判断完成后 从满足条件的索引连接中 取出 索引 头 和 尾 差值最小的那一组

代码

# 定义一个类: 用来存索引列表
class A:
    def __init__(self,name):
        self.li=[-1]
        self.name=name
        
s1 = input()
s2 = input()

# 创建一个列表 用来存放 T 中所有子字符的对象
lis = []




# 遍历s2 得到s2中所有子字符在s1中的索引列表
for i in s2:
    a=A()
    lis.append(a) # 将对象存入lis列表中
    
    while 1:	#循环查 得到 i 在 s1中的所有索引
    
        try:  #用index查 查不到就报错 报错就break
        
            # 这里 a.li[-1]+1 的意思是 每次查完 下次查的start位置是 从这次查到的索引+1位置开始查
            a.li.append(s1.index(i,a.li[-1]+1)) 
        except:
            
            a.li.remove(-1) # 然后删除列表默认值-1
            break


lii=[]
# 参数是两个对象 进行第一次判断 判断索引连接的长度是否大于s2 然后加入到lli列表中
def func(obj_i,obj_n):
    for i in obj_i.li:
        for n in obj_n.li:
            
            if abs(i-n)>=len(s2):
                if i>n:
                    lii.append([n,i])
                else:
                    lii.append([i,n])
                    
# 建立一个双循环 第一层循环是遍历 第一个--到--倒数第二个对象 第二层遍历第二个--到--最后一个对象 
# 也就是我们刚刚所说的  把 **A** 的所有索引 分别与 **B** **C** 的所有索引进行连接       
c = 0
for i in range(0,len(lis)-1):
    for n in range(1+c,len(lis)):
    	#调用func函数
        func(lis[i],lis[n])
    c+=1



# 遍历lli列表 每次得到的是一个索引连接字列表(例如:[0,5])
ls_bor=[]
for i in lii:
    # 创建一个lll列表
    lll=[i]
    # 遍历s2
    for s in s2:
        # 把 s2 中的所有子字符 是否存在索引连接对应的子字符串的布尔值存到lll
        lll.append(s in s1[i[0]:i[1]+1])
    # 若lll的值全是True 就传入到ls_bor列表中
    if False not in lll:
        ls_bor.append(lll)


# 得到索引连接差值最小的连接 返回给funcc        
# 这里的key= 得到 谁 的最小值 传入一个lambda函数 
funcc=min(ls_bor,key=lambda x:x[0][1]-x[0][0])[0] 
s,e=funcc

#展示
print(s1[s:e+1])

总结:

这题目的意思是我个人理解 我测试的结果跟官方答案的测试结果一样 索引不出意外我是对的🐕

代码很乱大家讲究看 有哪里很多余 大家可以帮我指出来哟

点个关注 谢谢 😄

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值