暴力子字符串查找算法
// pat用来存的是模式 txt存的是文本
//目的:在文本中模式可能出现匹配的任何地方检查匹配是否出现
int M=pat.length(); //M 模式长度
int N=txt.length(); //N 文本长度
for(int i=0;i<=N-M;i++) //i 跟踪文本 下面的j跟踪模式
{
int j;
for(j=0;j<M;j++)
{
if(txt[i+j]!=pat.[j])
break;
if(j==M ) return i; //找到匹配
}
}
return N; //未找到匹配
- 对于每个i,代码首先将j重置为0并不断将它扩大,直至找到了一个不匹配的 字符或是模式结束(j==M)为止。如果在模式字符串结束之前文本字符串就已经结束了(i==N-M+1),那么就没有找到匹配:模式字符串在文本中不存在。我们约定在不匹配时返回N的值。
另一种实现:(显示回退)
// pat用来存的是模式 txt存的是文本
//目的:在文本中模式可能出现匹配的任何地方检查匹配是否出现
int j,M=pat.length(); //M 模式长度
int i,N=txt.length(); //N 文本长度
for(i=0,j=0;i<N&&j<M;i++)//i对应上面的i+j 指向的是文本中已匹配的末端(i以前是指向这个序列的开头)
{
if(txt[i]==pat.[j]) j++;
else {i-=j;j=0;}
}
if(j==M ) return i-M; //找到匹配
else return N; //未找到匹配
Knuth-Morris-Pratt子字符串查找算法
- Knuth,Morris和Pratt发明的算法的基本思想是当出现不匹配时,就能知晓一部分文本内容(因为在匹配失败之前他们已经和模式相匹配了)。(这里有点小疑惑。。)我们可以利用这些信息将指针回退到所有这些已知的字符之前。