算法串匹配C++实现字符串匹配的KMP算法
生活随笔
收集整理的這篇文章主要介紹了
算法串匹配C++实现字符串匹配的KMP算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
新手發(fā)帖,很多方面都是剛?cè)腴T,有錯誤的地方請大家見諒,迎歡批評指正
? ? ?之前看《算法導(dǎo)論》符字串匹配分部講到KMP算法,被弄得云里霧里。天今看到阮一峰寫了一篇博客《符字串匹配的KMP算法》:
????http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
????講的淺顯易懂,便按照他的思緒用C++實現(xiàn)了一篇,代碼如下:
????
每日一道理“上下五千年,龍的看火不滅;古有愚公志,而今從頭越…… ”站在新世紀的門檻上,我們的追求就是讓祖國燦爛的喜悅飛揚在美好的明天……
#include <iostream> #include <string> using namespace std;//盤算單次的分部匹配值,如str=="ABCDAB"時回返2 int single_match(string str) {int n=str.length();string *prefix=new string[n-1]();string *suffix=new string[n-1]();for(int i=0;i!=n-1;++i){for(int j=0;j<=i;++j)prefix[i]+=str[j];for(int k=i+1;k!=n;++k)suffix[i]+=str[k];}int match_num=0;for(int i=0;i<n-1;++i)for(int j=0;j<n-1;++j)if(prefix[i]==suffix[j])match_num+=prefix[i].length();return match_num; }//對全部符字串,盤算其分部匹配表 void partial_match_table(string str,int* table) {int n=str.length();for(int i=0;i!=n;++i){string sub_str;for(int j=0;j<=i;++j)sub_str+=str[j];int temp=single_match(sub_str); table[i]=temp;} }// KMP算法 int Knuth_Morris_Pratt(string str1,string str2,int *table) {int n1=str1.length();int n2=str2.length();int i=0;while(i<n1-n2){int j=0;while(j<n2){if(str1[i+j]==str2[j])++j;elsebreak;}if(j==n2)break;else if(j==0)++i;elsei+=j-table[j-1];}if(i>n1-n2)return -1;return i; }int main() {string str1("BBC ABCDAB ABCDABCDABDE");string str2("ABCDABD");int n=str2.length();int *table=new int[n];for(int i=0;i<n;++i)cout<<table[i]<<' ';cout<<endl;cout<<Knuth_Morris_Pratt(str1,str2,table)<<endl;return 0; }
????代碼的缺陷是對符字串的處置過太硬生。習慣了python對string類型的切片作操后,對C++中string類型的應(yīng)用太疏生,以至于掏出子串的作操都用歷遍相加來實現(xiàn)……
????迎歡大家提出修改意見哈~
文章結(jié)束給大家分享下程序員的一些笑話語錄: 聯(lián)想——對內(nèi)高價,補貼對外傾銷的偉大“民族”企業(yè)。
總結(jié)
以上是生活随笔為你收集整理的算法串匹配C++实现字符串匹配的KMP算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决安装linux时未挂载文件而导致的重
- 下一篇: s3c2440移植MQTT