子串的定位操作通常称作串的 匹配模式(其中P,T称为模式串,PaTtern),是各种串处理系统中最重要的操作之一。
在串的模式匹配中, 子串P称为模式,主串S称为目标。
示例:
目标S:"Beijing"
模式P:"jin"
匹配结果 = 3(匹配位置从0开始)
Brute—Force 简称BF算法,亦称简单匹配算法。采用穷举的思想。
一. 具体思路
- 初始时让目标 S 的第 0 位与模式 P 的第 0 位对齐;
- 顺序比对目标 S 与模式 P 中的对应字符:
①. 若 P 与 S 比对发现对应位不匹配,则本趟失配。将 P 右移一位与 S 对齐,进行下一趟比对;
②. 若 P 与 S 对应位都相等,则匹配成功,返回 S 当前比较指针停留位置减去 P 的长度,即目标 S 中匹配成功的位置,算法结束;
③ 若 P 与 S 比对过程中, S 后面所剩字符个数少于 P 的长度,则模式匹配失败。
二. C++代码实现
#include<iostream>
#include<string>
using namespace std;
int index(string &S, string &P, int pos)
{//pos是从指定位置开始进行匹配
int i = pos, j = 0 ;
//i代表主串当前待比较的位置,j代表子串当前待比较的位置
while(i<S.size() && j<P.size())
{
if(S[i] == P[j])
{
i++; //若当前字符相同,则继续向下比较
j++;
}
else //主串,子串指针回溯重新开始下一次匹配
{
i=i-j+1; //主串退回到开始匹配
j=0; //子串从头开始匹配
}
}
if(j>=P.size() )
return (i-P.size() ); //返回匹配的第一个字符的下标
else
return -1; // 模式匹配不成功
}
int main()
{
string S,P;
int pos;
cin >> S >> P >> pos;
int x=index(S,P,pos);
if(x==-1)
cout << " 匹配不成功" << endl;
else
cout << "匹配成功" << "匹配结果=x" << endl;
return 0;
}
运行结果为:
三. BF算法分析
若设n为目标S的长度,m是模式P的长度,匹配算法最多比较n-m+1趟。若每趟比较都比较到模式P尾部才出现不等,要做m此比较,则在最坏的情况下,总比较次数(n-m+1)m。在多数场合下,m远小于n因此,==算法的运行时间为O(nm)==。
四. 低效的原因
算法在字符比较不相等,需要回溯(即i=i-j+1):即退到S中的下一个字符开始进行继续匹配。
五. 参考
中国大学MOOC 《数据结构》青岛大学 刘遵仁