アルゴリズムはC++にマッチし、文字列マッチングを実現するKMPアルゴリズムです.

2127 ワード

初心者の方は、入門したばかりで、間違ったところがありますので、ご了承ください.
     前に「アルゴリズム導論」の文字列を見ましたが、分部でKMPアルゴリズムを話しました.雲霧の中に入れられました.今日は阮一峰さんがブログ「文字列に一致するKMPアルゴリズム」を書いたのを見ました.
    http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.
    話したのは分かりやすくて、彼の考えによってC++で一篇実現しました.コードは次の通りです.
    
    毎日の道理
「上から下まで5千年、龍は火を見ても消えません.昔は愚公の志がありました.今は頭から上へ…」新世紀の敷居の上に立って、私達の追求は祖国の輝かしい喜びをすばらしい明日に舞い上がらせることです.
#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;

			else

				break;

		}

		if(j==n2)

			break;

		else if(j==0)

			++i;

		else

		    i+=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タイプの応用はあまりにもまばらで、サブストリングを取り出す操作は全部カレンダーで加算して実現します.
    みなさんの修正意見を歓迎します.
記事の終わりには、プログラムのいくつかのジョークの語録を共有します.