zoukankan      html  css  js  c++  java
  • 解析网页(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];
     }
    }

  • 相关阅读:
    mysql笔记--基础知识
    安全杂乱笔记整理1---常用服务端口总结
    ent orm笔记4---Code Generation
    ent orm笔记3---schema使用(下)
    ent orm笔记2---schema使用(上)
    ent orm笔记1---快速尝鲜
    Linux 更新yum源
    Lua 获取毫秒精度时间
    Linux docker镜像制作
    Linux 中文字符集安装
  • 原文地址:https://www.cnblogs.com/lixingle/p/3313017.html
Copyright © 2011-2022 走看看