ダイナミックプランニング-最長共通サブストリング
1746 ワード
dp[i][j]は、共通サブストリングの最後のアルファベットがstr 1[i]およびstr 2[j]である場合の共通サブストリングの長さとする.
状態遷移方程式: str 1[i]==str 2[j]のとき、dp[i][j]=dp[i-1][j-1]+1; str 1[i]!=str 2[j]の場合、dp[i][j]=0;
参考文献:
この文章には最適化アルゴリズムが含まれている:『最長共通サブストリングの動的計画解法とその最適化』
状態遷移方程式:
#include
#include
#include
using namespace std;
int findMaxSubstring(const char* str1, const char* str2)
{
int dp[100][100];
int len1 = strlen(str1);
int len2 = strlen(str2);
for (int i = 0; i < len1; i++)
{
if (str1[i] == str2[0])
{
dp[i][0] = 1;
}
else
{
dp[i][0] = 0;
}
}
for (int j = 0; j < len2; j++)
{
if (str1[0] == str2[j])
{
dp[0][j] = 1;
}
else
{
dp[0][j] = 0;
}
}
int maxLen = 0;
int endIndex = 0;
for (int i = 1; i < len1; i++)
{
for (int j = 1; j < len2; j++)
{
if (str1[i] == str2[j])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
if (maxLen < dp[i][j])
{
maxLen = dp[i][j];
endIndex = i;
}
}
else
{
dp[i][j] = 0;
}
}
}
for (int i = endIndex - maxLen + 1; i <= endIndex; i++)
{
cout << str1[i];
}
cout << endl;
return maxLen;
}
int main()
{
char str1[100];
char str2[100];
gets(str1);
gets(str2);
int maxlen = findMaxSubstring(str1, str2);
cout << maxlen << endl;
return 0;
}
参考文献:
この文章には最適化アルゴリズムが含まれている:『最長共通サブストリングの動的計画解法とその最適化』