最長共通サブストリング問題
1312 ワード
2つの文字列の最も長い共通のサブストリングを求めます:たとえば2つの文字列BDCABAとABCBDABを入力して、それらの最も長い共通のサブストリングはBDとABがあって、長さはすべて2です.
解法1:ダイナミックプランニング
解法1:ダイナミックプランニング
#include <string>
#include <iostream>
using namespace std;
int longestCommonSubstring(string s1, string s2){
int len1 = s1.size();
int len2 = s2.size();
int **c = new int*[len1 + 1];
for(int i = 0; i < len1 + 1; ++i){
c[i] = new int[len2 + 1];
}
for(int i = 0; i < len1 + 1; ++i)
c[i][0] = 0;
for(int j = 0; j < len2 + 1; ++j)
c[0][j] = 0;
int max = -1;
int x, y;
for(int i = 1; i < len1 + 1; ++i){
for(int j = 1; j < len2 + 1; ++j){
if(s1[i - 1] == s2[j - 1])
c[i][j] = c[i - 1][j - 1] + 1;
else
c[i][j] = 0;
if(c[i][j] > max){
max = c[i][j];
x = i;
y = j;
}
}
}
string s;
int i = x - 1, j = y - 1;
while(i >= 0 && j >= 0){
if(s1[i] == s2[j]){
s += s1[i];
--i;
--j;
}
else
break;
}
reverse(s.begin(), s.end());
cout << " " << s << endl;
for(int i = 0; i < len1 + 1; ++i)
delete [] c[i];
delete [] c;
return max;
}
int main(){
string s1, s2;
cin >> s1 >> s2;
int len = longestCommonSubstring(s1, s2);
cout << " : " << len << endl;
return 0;
}