引言
字符串模式匹配:
\quad \quad 设 S 和 T 是给定的两个串,在主串 S 中找到模式串 T 的过程称为字符串匹配,如果在主串 S 中找到模式串 T ,则称匹配成功,函数返回 T 在 S 中首次出现的位置,否则匹配不成功,返回 -1。
例:
在上图中,我们试图找到模式串 T = baab,在主串 S = abcabaabcabac 中第一次出现的位置,即为红色阴影部分, T 第一次在 S 中出现的位置下标为 4 ( 字符串的首位下标是 0 ),所以返回 4。如果模式串 T 没有在主串 S 中出现,则返回 -1。
1、基本思想
BF算法,即暴力(Brute Force算法),又称朴素算法。
基本思想:
\quad \quad 从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较后者的后续字符;否则,从主串S的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,直到T中的字符全部比较完毕,则说明本趟匹配成功;或S中字符全部比较晚,则说明匹配失败。
2、伪代码
1、在串S和串T中初始下标i=0和j=0
2、循环直到S或T的所有字符均未比较完:
- 2.1 如果S[i]==T[j],继续比较S和T的下一个字符
- 2.2 否则,将i回溯到i-j+1,j回溯到0,重新比较
3、如果T中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回-1。
3、代码实现
def BF(s,t):
i=0
j=0
while i<len(s) and j<len(t):
if s[i]==t[j]:
i+=1
j+=1
else:
i=i-j+1
j=0
if j>=len(t):
return i-len(t)
else:
return -1
if __name__=="__main__":
s="abcabaabcabac"
t="baab"
b=BF(s,t)
print(b)
- 时间复杂度: O ( m ∗ n ) O(m*n) O(m∗n),其中m,n分别为主串、模式串的长度
- 空间复杂度: O ( 1 ) O(1) O(1)