2つの最長共通部分文字列と最長共通部分列の出力。非常に近いアプローチで2つの文字列の最長の共通部分、及び最長共通サブシーケンスを解決する動的プログラミングです。しかし、漸化式の異なるものがあります。
2つの最長共通部分文字列の出力
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 文字列LCS(列STR1、STR2文字列){ IF(str1.empty()|| str2.empty()){ リターン""。 } INT indexMax = 0、MAXN = 0。 ベクター<ベクトル<整数>> L(str1.size()、ベクトル<整数>(str2.size()、0)); //全部初始化为0 // L [I] [J]代表STR1 [0〜I-1]和STR2 [0〜とJ-1]的最长公共子串的长度 (I = 0をint型のため、私は< str1.length(); iは++){ (; J <str2.length(int型J = 0);のためにJ ++){ IF(STR1 [i]を== STR2 [J]){ IF(I == 0 || J == 0){ L [I] [J] = 1。 } 他{ L [i] [j]はL [I-1] [J-1] +1 =。 //他STR1 [i]は!= str2のである[ j]が、この場合、L [i]は[J] =で、場合 0、 初期設定が0に設定されているので、それはここでは書かれていません。 処理// L [i] [j]の終了後、記録されたかどうかをチェックする (L [I]、[J]> MAXN){IF MAXN = L [I]、[J]; //は最長共通サブシーケンスを記録文字列の長さ indexMax = I;文字の終了位置「最長共通部分は、」記録//の時に発生する } } } 戻りstr1.substr(indexMax + 1-MAXN、MAXN); //文字列を取り、長さを有しています(エンドスタート+ 1)= MAXN、 次に=エンド+ 1スタートMAXN。 // indexMax - (。+ indexMax-MAXN 1)1 = + MAXN、取得されMAXN長ストリング。 } のIntメイン(){ 文字列STR1、STR2、 ストリングCUR、 一方(のgetline(CIN、CUR)){ IF(str1.empty())STR1 = CUR; 他IF(str2.empty())= STR2のCUR。 (!!str1.empty()&& str2.empty()){場合 はcout << LCS(STR1、STR2)<<てendl; str1.clear(); str2.clear(); } cur.clear()。 } }
二つの出力文字列の最長共通部分列。そして、元の文字列に部分文字列を必要とする連続したシーケンスを、必要としない共通部分列の共通部分文字列の間の差が連続しています。