在处理多行文本寻找子串时,我们用到查找的方法叫做模式匹配,下面我介绍两种模式匹配算法:
1.朴素模式匹配算法:
顾名思义,朴素的模式匹配算法就是按照匹配串的字符顺序每循环自增一来匹配模式串。
int simple_StringMatching(string match,string target,int pos)
{ //match是模式串,target是目标串,pos是开始匹配的位置
int i=pos,j=0;
while(i<target.size()-match.size()){
j=0;
while(target[i]==match[j]&&j<match.size()){
i++; j++;
}
if(j==match.size()){
return i-j;
}
else i=i-j;
}
return -1;
}
2.KMP算法:朴素模式匹配的算法写起来较简单,但是比较低效,最坏情况下需要匹配n-m+1次,每次匹配做m次比较,最坏时间复杂度是m(n-m+1),时间复杂性为O(mn)。
这里考虑一个例子:
目标串 | 模式串 |
aaaaaaaaaaaaab | aaab |
在这个例子中,达到了上述的最坏情况,但是,其实好多情况下是不需要再匹配的
目标串: a a a a a