字节230917秋招笔试

1.小红查单词
小红拿到了一个仅由英文字母组成的字符串。她想知道某单词在该字符串中出现了多少次,你能帮帮她吗?
请注意,小红会询问多次。

输入描述
第一行输入两个正整数n和q,代表字符串长度和询问次数。
第二行输入一行长度为n的,仅由小写英文字母组成的字符串。代表小红拿到的字符串。
接下来的q行,每行输入一个仅由小写英文字母组成的字符串,代表小红的每次查询。
1<=n,q<=10^5
每次查询的字符串长度不超过 10。

输出描述
输出q行,每行输出一个整数,代表该次查询的结果。

示例1

输入
10 3
bobobalice
bob
alice
red

输出
2
1
0

思路与代码

# 计算并返回子串 s[l:r+1] 的哈希值,这个哈希值用于快速比较字符串是否相同
def get(l, r):
    return h[r] - h[l - 1] * p[r - l + 1]

n, q = map(int, input().split())
s = input()

# h和p数组分别用于存储字符串的哈希值和幂的值
h = [0] * (n + 1)
p = [0] * (n + 1)
base = 13331
h[0] = 0
p[0] = 1

# 
for i in range(1, n + 1):
    h[i] = h[i - 1] * base + ord(s[i - 1])
    p[i] = p[i - 1] * base

# 用于存储查询单词的哈希值以及它们出现的次数
mp = {}
'''
嵌套循环遍历不同长度的子串,并计算它们的哈希值,然后将哈希值作为键,出现的次数作为值存储在 mp 中
'''
# 每次查询的字符串长度不超过 10,所以length的范围是(1,11)
for length in range(1, 11):
    for i in range(n):
        if i + length > n:
            break
        now = get(i + 1, i + length)
        if now in mp:
            mp[now] += 1
        else:
            mp[now] = 1

# 使用一个循环处理每个查询
for i in range(q):
    x = input()
    y = 0
    # 将查询的字符串计算成一个哈希值 y
    for c in x:
        y = y * base + ord(c)
    # 检查 y 是否在哈希表 mp 中。
    if y in mp:
        # 如果在 mp 中找到了对应的哈希值
        print(mp[y])
    else:
        print(0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值