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

用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];
 }
}

转载于:https://www.cnblogs.com/lixingle/archive/2012/11/03/3313017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值