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