一、题目要求
实现字符串模式匹配BF(Brute-Force)算法(基于链串也可以)。
函数功能:BF算法——求模式串t在目标串s是否匹配
函数输入:目标串s、模式串t
函数输出:匹配成功:返回模式串t首次在s中出现的位置
匹配不成功:返回-1
二、思路:
借鉴网上C++思路写了python的实现:
1 子串t从头开始,依次与主串对比,匹配失败时子串从头开始,主串后移
2 一个循环三个判断
- i和k(主串每次匹配的开头)的距离与j和开头的距离相同且j位于子串末尾——匹配成功
- 不断判断对应位置是否相同,相同向后遍历
- 一旦不同使主串后移,子串清0重新开始对比(如果一轮开始前主串剩余长度<子串长度直接匹配失败)
三、代码:
#!/usr/bin/python3
# author lzx
# python实现
def BF(s, t):
i = 0
j = 0
k = 0
flag1 = -1
while (i < len(s) and j < len(t)):
# 匹配成功
if (i - k == j) and (j == len(t) - 1) and (s[i] == t[j]):
flag1 = k
break
# s和t相等就继续向后匹配
if s[i] == t[j]:
i = i + 1
j = j + 1
# 不相等从k的位置开始匹配
else:
k = k + 1
i = k
j = 0
# 假如s中所剩字符小于t中所剩字符
if (len(s) - i) < len(t):
flag1 = -1
break
return flag1
if __name__ == '__main__':
s = input('输入目标串s:')
t = input('输入模式串t:')
flag = BF(s, t)
if flag != -1:
print('t在s的位置:', flag)
else:
print(flag, '匹配失败')