字节跳动第四批笔试题第3题
题目:
输入2组字符串,分别是字符串S,T,如果有该子串则输出该子串,否则输出空串。
输入:ADSKBACWDWKDEH
输入:ABCD
输出:BACWD
题目的意思
输入字符串 **S** 和 字符串 **T**
然后输出的结果是 字符串**S** 中 包含字符串**T**中所有子字符且长度最短的子串
比如
**ADSKBACWDWKDEH** 包含**ABCD** 输出结果 **BACWD**
**ACCAAJJDHJJKDJ** 包含**CAD** 输出结果 **CAAJJD**
思路
- 首先得到 T 中所有 子字符 在 S 中的下标
- 因为我们不知道 T 中就多少个 子字符 所以要创建一个类 属性就是一个空列表
存放该 字符 的所有下标
-
得到下标列表后 关键的一步
比如
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])
总结:
这题目的意思是我个人理解 我测试的结果跟官方答案的测试结果一样 索引不出意外我是对的🐕
代码很乱大家讲究看 有哪里很多余 大家可以帮我指出来哟