解析网页(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];
}
}