博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析网页(KMP算法实现部分)
阅读量:5134 次
发布时间:2019-06-13

本文共 1284 字,大约阅读时间需要 4 分钟。

用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

你可能感兴趣的文章
设计模式之结构型模式
查看>>
poj2569
查看>>
使用pygal_maps_world.i18n中数据画各大洲地图
查看>>
jQuery EasyUI 的下拉选择combobox后台动态赋值
查看>>
timeline时间轴进度“群英荟萃”
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
同步代码时忽略maven项目 target目录
查看>>
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>