串的模式匹配算法 ← BF算法
BF算法(Brute-Force算法)
BF算法,又称暴力匹配算法或朴素匹配算法,是一种简单直观的字符串匹配方法。其核心思想是通过逐个比较主串和模式串的字符,直到找到完全匹配的子串或遍历完整个主串。
算法原理
主串长度为 n,模式串长度为 m。从主串的第一个字符开始,依次与模式串的字符进行逐位比较。若发现不匹配的字符,则将模式串向后滑动一位,重新从模式串的第一个字符开始比较。
算法步骤
● 主串的第i个字符(初始时i=pos)和模式的第一个字符(j=0)比较,若相等,继续逐个比较后续字符(i++、j++);若不等,从主串的下一字符(i=i-j+1)起,重新与模式的第一个字符(j=0)比较。
● 直到主串的一个连续子串字符序列与模式相等 。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
● 否则,匹配失败,返回值 -1。
示例演示
设主串 S = "ABCABDABCAB"(n=10),模式串 P = "ABCAB"(m=5)。
实际过程:
初始 i=0, j=0,S[0]=A == P[0]=A → i=1, j=1。
S[1]=B == P[1]=B → i=2, j=2。
S[2]=C == P[2]=C → i=3, j=3。
S[3]=A == P[3]=A → i=4, j=4。
S[4]=B == P[4]=B → i=5, j=5。此时 j=m=5,匹配成功,起始位置为 5-5=0?不,i 此时是 5,j=5,起始位置是 i-j=0,即 S[0:5] 为 "ABCAB",正确。
模版代码
#include <bits/stdc++.h>
using namespace std;int BF(string S,string T) {int i=0,j=0;while(i<S.length() && j<T.length()) {if(S[i]==T[j]) {i++;j++;} else {i=i-j+1;j=0;}}if(j>T.length()-1) return i-T.length()+1;else return -1;
}int main() {string s,t;getline(cin,s);getline(cin,t);cout<<BF(s,t);return 0;
}/*
input:
abefdeffabc
effa
output:
6
*/