代码改变世界

解析网页(KMP算法实现部分)

2012-11-03 16:49  Lves Li  阅读(223)  评论(0编辑  收藏  举报

用kmp算法实现在一个网页内网址的提取,整个项目在这点击打开链接。只要把里边的kmpDlg.cpp文件了的部分内容用以下代码替换即可。

kmp算法无回溯的查找匹配串所在位置,效率更高·····

 

 

void CKmpDlg::OnButtonKmp()
{
 // TODO: Add your control notification handler code here

 //参照CKmpDlg::OnButtonLink()函数,填写完整,将函数中Find函数部分皆改写为
 //KMP算法,提示:CString类型变量可通过下标引用单个字符元素,如m_EditResult[0],
 //m_EditResult.GetLength()可求串长度。
 CString m_sLink="";
 int i=1,j,k;
 i=IndexKMP(m_EditResult,"href",1);//定位href位置
 while(i>0)
 {
  j=IndexKMP(m_EditResult,"\"",i+4);  //定位href后第一个"位置
  if(j<=0)
   break;
  k=IndexKMP(m_EditResult,"\"",j+1);  //定位href后第二个"位置
  if(k<=0)
   break;
  m_sLink+=m_EditResult.Mid(j,k-j-1)+"\r\n";  //Mid为求子串函数,第一个参数j+1换成j才不会丢失第一个字符
  //m_sLink+="nihao";
  i=IndexKMP(m_EditResult,"href",k+1);
 }
    m_EditResult=m_sLink; 
 UpdateData(FALSE); 
}

int IndexKMP(CString S,CString T,int start)
{
 //填写KMP算法函数,包含求next部分
 //start为主串定位起始位置,即从start向后查找模式串
 int i=start;
 int j=1;
 int next[1000];
 GetNext(T,next);
 while (i<=S.GetLength()&&j<=T.GetLength()){
  if (j==0||S[i-1]==T[j-1]){//这已改变
   ++i;
   ++j;
  }
  else
   j=next[j]; 
 }
 if (j>T.GetLength()){
 return i-T.GetLength();
 } else
 return 0; 
}

void  GetNext(CString T,int next[])
{
 //填写求next函数
 int i=1;
 next[1]=0;
 int j=0;
 while (i<T.GetLength()){
  if (j==0||T[i]==T[j]){  
   ++i;
   ++j;
   next[i]=j;
  }else
   j=next[j];
 }
}