http://www.cnblogs.com/qq78292959/archive/2013/10/23/3383953.html
BF
- 复杂度: O[(n−m)m]
- http://www.tuicool.com/articles/VjMzuqz
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include"time.h"
#include "string.h"
#define OK 1
#define ERROR 1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 //分配存储空间
int BF(const char * str1,const char* str2){
int str1_len=strlen(str1);
int str2_len=strlen(str2);
int i=0,j=0,tmp=0;
if(str1_len==NULL || str2_len==NULL)
return -1;
while(i<str1_len && j<str2_len){
if(str1[i]==str2[j]){
i++;
j++;
}else{
tmp++;
// i=i-j+1;
i=tmp;
j=0;
}
}
if(j==str2_len)
return i-j;
else
return -1;
}
int main(){
char SrcStr[] = "soabcsoul";
char DstStr[] = "soul";
int result = 0;
int len1 = strlen(SrcStr);
int len2 = strlen(DstStr);
printf("len1= %d, len2 = %d\n", len1, len2);
result = BF(SrcStr, DstStr);
printf("%d \n",result);
return 0;
}
KMP
1. 算法
O(N)
- 利用不匹配字符的前面那一段字符的最长前后缀来尽可能地跳过最大的距离
- kmp算法:关键看短字串是否自身有重复,有重复则next数组,无重复,则直接全部跳过;
2. next数组的选择
- 前缀后缀的相似程序
- 找前缀和后缀相等且最大的字串
T串的各位的 j 值定义为一个数组
next , next 的长度就是 T 串的长度j=1 ,则 next[j]=0- 存在前缀后缀相等情况; next[j]=max{1<k<j}
- 其他 next[j]=1
#include<stdlib.h>
#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include <algorithm>
#include<queue>
#include<string>
using namespace std;
void CalcNext(char*p, int next[]){
int nLen=strlen(p);
next[0]=-1;
int k=-1;
int j=0;
while(j<nLen-1){
if(k==-1 ||p[j]=p[k]){
++k;
++j;
next[j]=k;
}else{ //p[j]与p[k]失配,则继续 递归当前索引p[p[next]]
k=next[k];
}
}
}
void CalcNext2(char*p, int next[]){
int nLen=strlen(p);
next[0]=-1;
int k=-1;
int j=0;
while(j<nLen-1){
if(k==-1 ||p[j]=p[k]){
++k;
++j;
if(p[j]==p[k])
next[j]==next[k];
else
next[j]=k;
}else{ //p[j]与p[k]失配,则继续 递归当前索引p[p[next]]
k=next[k];
}
}
}
int KMP(int n) //n是字符串 的长度
{
int ans=-1;
int i=0;
int j=0;
int pattern_len=strlen(g_pattern);
while(i<n){
if(j==-1 ||g_s[i]==g_pattern[j]){
++i;
++j;
} else
j=g_next[j];
if(j==pattern_len){
ans=i-pattern_len;
break;
}
}
return ans;
}