刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!
面试题
手写代码实现子串包含问题(KMP 算法)。
使用微信搜索喵呜刷题,轻松应对面试!
答案:
解答思路:
实现子串包含问题可以使用多种算法,其中KMP(Knuth-Morris-Pratt)算法是一种高效且优雅的解决方案。该算法通过预处理子串构建一个部分匹配表(也称为跳转表),在匹配过程中能够高效地进行状态跳转,避免不必要的字符比较。
最优回答:
以下是使用KMP算法实现子串包含问题的伪代码:
def KMP_substring_search(main_string, sub_string):
# 构建部分匹配表
def build_partial_match_table(sub_string):
m = len(sub_string)
partial_match_table = [0] * m
j = 0 # 子串中的索引位置,用于记录已匹配的字符个数
for i in range(1, m): # 主串中每个字符与子串进行匹配
while j > 0 and sub_string[j] != sub_string[i]: # 如果当前字符不匹配,调整j的值进行跳转
j = partial_match_table[j - 1] # 根据部分匹配表进行跳转
if sub_string[j] == sub_string[i]: # 如果匹配成功,增加匹配的字符个数
j += 1
partial_match_table[i] = j # 更新部分匹配表的值
return partial_match_table
# 使用部分匹配表进行子串搜索
m = len(sub_string) # 子串长度
n = len(main_string) # 主串长度
partial_match_table = build_partial_match_table(sub_string) # 构建部分匹配表
i = j = 0 # i为主串中的位置,j为子串中的位置
while i < n: # 主串中每个字符与子串进行匹配
while j > 0 and main_string[i] != sub_string[j]: # 如果当前字符不匹配,根据部分匹配表进行跳转
j = partial_match_table[j - 1] # 进行跳转操作
if main_string[i] == sub_string[j]: # 如果匹配成功,增加匹配的字符个数并检查是否完全匹配成功
j += 1 # 增加匹配的字符个数
if j == m: # 完全匹配成功,返回子串在主串中的起始位置
return i - j + 1 # 返回结果位置信息(从起始位置开始计算)
i += 1 # 继续主串中的下一个字符与子串进行匹配操作
return -1 # 如果未找到子串,返回-1表示未找到结果信息位置信息(从起始位置开始计算)
解析:
创作类型:
原创
版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。 让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!



