问题描述
两个字符串S和T,在主串S中查找子串T。
多用于文本处理系统、操作系统、编译系统、数据库系统及Internet信息检索系统。
问题特征
- 问题规模很大。
- 匹配操作经常被调用,执执行频率高。
问题解决
① BF算法
从主串S第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较,若不相等,则从主串S的第二个字符开始和模式T的第一个字符进行比较。重复上述过程。若T中字符全部比较完毕,则说明匹配成功,若S中字符全部比较完毕,则匹配失败。
时间复杂度:
- 一般情况下m<<n 因此时间复杂度为O(n)
- 最坏情况下 O(m*n)
int BF(char S[ ],char T[ ]){
int index=0;
int i=0,j=0;
while((S[i]='\0') && (T[j] != '\0')){
if(S[i]==T[j]){
i++;
j++;
}
else{
index++;
i=index;
j=0;
}
if(T[j]=='\0') return index+1;
else return 0;
}
此算法效率低,因为要进行回溯。往往一些回溯是不必要的。
② KMP算法
<