当前位置: 首页 > 面试经验 >

【华为OD机试2023】最左侧冗余覆盖子串(Python)

优质
小牛编辑
109浏览
2023-03-28

【华为OD机试2023】最左侧冗余覆盖子串(Python)

题目描述:

给定2个字符串s1和s2和正整数k,其中s1长度为n1,s2长度为n2,在s2中选一个子串,满足:  

该子串长度为n1+k

该子串包含s1中全部字母

该子串每个字母的出现次数不小于s1中对应的字母

我们称s2以长度k冗余覆盖s1。给定s1、s2和k,求最左侧的s2以长度k冗余覆盖s1的子串的首个元素的下标,如果没有返回-1

举例: s1=ab s2=aabcd k=1 则子串aab和abc均满足此条件,由于aab在abc的左侧,aab的第一个元素下标为0,因此输出0

输入描述:

输入三行,第一行为s1,第二行为s2,第三行为k

s1和s2只包含小写字母

输出描述:

最左侧的s2以长度k冗余覆盖s1的子串首个元素的下标,如果没有返回-1

补充说明:

0 <= len(s1) <= 1000000

0 <= len(s2)  <= 20000000

0 <= k <= 1000

示例1

输入:

ab

aabcd

1

输出:

0

说明:

子串aab和abc满足要求,由于aab在abc的左侧,因此输出aab的下下标:0

示例2

输入:

abc

dfs

10

输出:

-1

说明:

s2无法覆盖s1,输出-1


#定义函数,判断字符串s2是否符合题目中冗余覆盖s1的要求
def num_count_in(s1:str,s2:str):
count=0
a=set(s1)
b=set(s2)
l=len(a)
for i in a:
if s1.count(i)<=s2.count(i):
count+=1
if count==l:
return True
else:
return False

s1=input()
s2=input()
k=int(input())
lenth=len(s1)+k
first_alpha=-1
for num in range(0,len(s2)-lenth+2):
if num_count_in(s1,s2[num:num+lenth]):
first_alpha=num
break
print(first_alpha)

 类似资料: