串的模式匹配算法
算法目的:确定主串中所含子串第一次出现的位置
算法应用:搜索引擎、拼写检查、语言翻译等
算法种类:BF算法(Brute-Force,特点:古典、景点、朴素、穷举)
KMP算法(特点:速度快)
BF算法介绍:
在主串中查找与模式T(副串)相匹配的子串,如果匹配成功,返回子串在主串出现的第一个字符的位置。
不一定非要从第一个元素开始。可以指定在主串中的起始位置。
BF算法设计思想:
Index(S,T,pos)
- 将主串第pos个字符和模式串的第一个字符比较
- 若相等,继续逐个比较后续字符串
- 若不相等,从主串的下一个字符起,重新与模式串的第一个字符比较
- 直到主串的一个连续字符串序列与模式串相等。返回S与T匹配子序列第一个字符的序号,即匹配成功
- 否则,匹配失败,返回值0
过程演示:
主串:aaaaab
模式串:aaab
匹配过程描述:数组存储字符串,从第一个字符开始,下标为0。使用S[i]获取主串字符,使用T[j]获取模式串字符。
如果S[i]==j[i],++i,++j;
如果S[i]!=j[i],i返回为起始值加一,j重置为0。
- 第一趟匹配:
i=0
a a a a a b
a a a b
j=0
//当i=3 j=3时 S[i]=a J[i]=b不匹配,i=(i-j+1)=(3-3+1)=1
j=0
- 第二趟匹配:
i=1
a a a a a b
a a a b
j=0
//当i=4 j=3时 S[i]=a J[i]=b不匹配,i=(i-j+1)=(4-3+1)=2
j=0
- 第三趟匹配:
i=2
a a a a a b
a a a b
j=0
//当i=5 j=3时,匹配成功,返回(i-T.length)
代码实现:
public int IndexOfBF(String S,String T,int pos){
char []a = S.toCharArray();
char []b = T.toCharArray();
int i=pos;int j=0;
while(i<S.length() && j<T.length()){
if(a[i]==b[j]){ // 比较每个字符,都匹配
i++;
j++;//比较下一位
}
else{ //有不匹配的字符
i=i-j+1;//i赋值为当前值的下一位
j=0;//j重头开始
}
}
if(j>=T.length()){//匹配成功(参考第三趟匹配成功时,j为4,T.length也是4)
return i-T.length();
}
else{
//匹配失败
return 0;
}
时间复杂度:
若n为主串长度,m为子串长度,最坏的情况是
- 主串前n-m个位置都匹配到了子串的最后一位,即这n-m位各比较了m次。
- 最后m位各比较了1次
总次数为:(n-m)*m+m=(n-m+1)*m
若m<<n 则算法复杂度O(n*m)