我正在尝试进行动态编程以查找LCS的长度。我已经使用了二维数组。但是对于大字符串,它会因内存溢出而产生运行时错误。请告诉我如何在一维数组中进行操作以避免内存约束。
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
int max(int a, int b);
int lcs( string X, string Y, int m, int n )
{
int L[m+1][n+1];
int i, j;
for (i=0; i<=m; i++)
{
for (j=0; j<=n; j++)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (X[i-1] == Y[j-1])
L[i][j] = L[i-1][j-1] + 1;
else
L[i][j] = max(L[i-1][j], L[i][j-1]);
}
}
return L[m][n];
}
int max(int a, int b)
{
return (a > b)? a : b;
}
int main()
{
string X;
string Y;
cin>>X>>Y;
int m = X.size();
int n = Y.size();
printf("Length of LCS is %d\n", lcs( X, Y, m, n ) );
return 0;
}
答案 0 :(得分:4)
请注意lcs
中的递归仅使用L
矩阵的最后两行。因此,您可以轻松地重写您的解决方案以使用O(N)内存。
这是关于这个主题的good article。
答案 1 :(得分:0)
二维数组无论如何都是虚构的,它仍然是一维数组,所以你自己计算索引,即:所以你的数组int L [(n + 1)(m + 1)]和L [i] [j] = L [i (n + 1)+ j]
的索引