字串的模式匹配
字串的模式匹配問題描述如下:若打算在字串T中查詢是否包含子串與字串P相等,則稱字串T為目標,P為模式,並稱這個查詢的過程為串的模式匹配。
BF模式匹配:這個模式匹配演算法是由Brute和Foece提出的。其基本思想為:
(1)初始時讓兩字串的起始位置對齊。
(2)順序比較兩個字串,比較結果有如下三種可能:
1.匹配成功,則將目標串的比較指標的指向位置減去模式串的長度返回,即為匹配成功的位置。
2.匹配過程中匹配失敗,則目標串的比較指標指向上次比較的起始位置的下一位,模式串指向模式串的起點。
3.匹配時發現目標串的剩餘字元長度小於模式串的長度,則匹配失敗。
假設目標串T為"aaaacxhdsse",模式串P為"aac",這串的模式匹配過程如下:
0 1 2 3 4 5 6 7 8 9 10 11
第一趟 a a a a c x h d s s e
a a c!
第二趟 a a a a c x h d s s e
a a c!
第三趟 a a a a c x h d s s e
a a c
由圖可知,第三趟匹配結束之後,字串的模式匹配完成!!!
BF模式匹配程式碼如下:
#include <iostream>
#include <string>
using namespace std;
int Index(string s, string t){
int lens = s.length();//計算串s、t的長度
int lent = t.length();
int i = 0;
int j = 0;
while (i < lens&&j < lent){//如果i、j都各自小於lens和lent
if (t[j] == s[i]){//如果子串的t[j]和主串的s[i]相等
++i;//各自索引都自增
++j;
}
else{//否則,主串的索引比剛開始後移一個;子串的索引變為0
i = i - j + 1;
j = 0;
}
}
if (j == lent){//如果最j和lent的大小一樣,證明找到了,返回子串在主串中的索引
return i - lent + 1;
}
else{//否則返回-1
return -1;
}
}
int main(){
string s,t;
cin>>s;
cin>>t;
int pos = Index(s, t);
if (pos != -1){
cout << "find " << t << " at the index " << pos << " of " << s << endl;
}
else{
cout << "can't find " << t << " in " << s << endl;
}
return 0;
}