暴力字符串查找

暴力子字符串查找算法

// 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发明的算法的基本思想是当出现不匹配时,就能知晓一部分文本内容(因为在匹配失败之前他们已经和模式相匹配了)。(这里有点小疑惑。。)我们可以利用这些信息将指针回退到所有这些已知的字符之前。

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/81163732