关于传统字符查找(BF算法)和KMP算法
关于字符串的查找,以前一直觉得很难,现在重新来看,感觉要好很多了~多的不谈,直接上代码~
//关于模式串的查找,BF算法(传统算法)与KMP算法
#include<bits/stdc++.h>
using namespace std ;
int BF(string s ,string t ){//传统暴力算法——BF算法
int i = 0 ,j = 0 ,starts = 0 ;//i是s的遍历指针,j是t的遍历指针,starts记录每一轮s开始的位置
while(i < s.length() && j < t.length() ){
if(s[i] == t[j]){
++i ;
++j ;
}else {
++starts ;
i = starts ;
j = 0 ;
}
}
if(j>= t.length()){
return starts ;
}else {
return -1 ;
}
}
void Get_Next(string t ,int next[]){//KMP算法第一步,获取next数组
int i = 0 ,j = -1 ;//两个指针,i是一往无前的(遍历t),j用来找最长相同前缀长度
next[0] = -1 ;//第一个要置为-1,代表没有
while (i < t.length()){
if(t[i] == t[j] || j == -1 ){//判断条件要加上j==-1,不然进不来
++i ;
++j ;
next[i] = j ;
}else j = next[j];
}
}
int KMP(string s ,string t ,int next[]){//第二步,开始匹配
int i = 0 ,j = 0 ;
while (i < s.length() && j < t.length()){
if(j == -1 || s[i] == t[j]){
++ i ;
++ j ;
}else j = next[j];//i不再回溯,j根据next来跳转
}
if(j >= t.length()){
return i - t.length();
}
return -1 ;
}
int main (){
string s = "ababcabcacbab";
string t = "abcac";
cout << s << endl ;
cout << BF(s, t)<<endl ;
int next[t.length()];
memset(next, 0, sizeof(next));
Get_Next(t, next);
cout << KMP(s,t,next)<< endl ;
}