创建具有非常量大小的数组
Creating array with non constant sizes
我目前正在做一项作业,我必须找到一种方法来输出两个字符串的最长公共子序列。在我发现此代码的所有其他实现中,它们都有一个相似之处:多个数组使用非常量变量初始化,我一直了解到这是不允许的。当我尝试编译该程序时,因此出现错误。像这样的代码首先应该如何编译?
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//Prints the Longest common subsequence
void printLCS(char *s1, char *s2, int m, int n);
/* Driver program to test above function */
int main()
{
char s1[] = "ABCBDAB";
char s2[] = "BDCABA";
printLCS(s1, s2, strlen(s1), strlen(s2));
return 0;
}
void printLCS(char *s1, char *s2, const int m, const int n)
{
int L[m + 1][n + 1];
//Building L[m][n] as in algorithm
for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (s1[i - 1] == s2[j - 1])
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
//To print LCS
int index = L[m][n];
//charcater array to store LCS
char LCS[index + 1];
LCS[index] = '[=10=]'; // Set the terminating character
//Stroing characters in LCS
//Start from the right bottom corner character
int i = m, j = n;
while (i > 0 && j > 0)
{
//if current character in s1 and s2 are same, then include this character in LCS[]
if (s1[i - 1] == s2[j - 1])
{
LCS[index - 1] = s1[i - 1]; // Put current character in result
i--; j--; index--; // reduce values of i, j and index
}
// compare values of L[i-1][j] and L[i][j-1] and go in direction of greater value.
else if (L[i - 1][j] > L[i][j - 1])
i--;
else
j--;
}
// Print the LCS
cout << "LCS of " << s1 << " and " << s2 << " is " << endl << LCS << endl;
}
特别是数组 L
和数组 LCS
的声明。
抱歉,如果这段代码一团糟,我真的 post 不在这里。任何帮助将不胜感激。
大多数人使用的 GCC 编译器中有一个允许可变长度数组的非标准扩展。不过你真的不应该使用它,因为 VLA 有 a lot of downsides,这就是为什么它们首先不在 C++ 标准中的原因。此外,当您的程序由于试图在堆栈上创建一个大数组而接收到大量输入时,您可能最终会导致堆栈溢出。
使数组大小不变或使用 std::vector
。
添加 #include <cstring>
(对于 strlen()
)
让我能够编译它:http://cpp.sh/3gwwd
和输出
LCS of ABCBDAB and BDCABA is
BDAB
哪个是正确的,不是吗? (我不知道 LCS)[http://lcs-demo.sourceforge.net/]
当性能不是绝对优先时,您可以考虑使用 std::vector<char>
,它的障碍要少得多(您还包含了矢量 class 但没有使用它?)
我目前正在做一项作业,我必须找到一种方法来输出两个字符串的最长公共子序列。在我发现此代码的所有其他实现中,它们都有一个相似之处:多个数组使用非常量变量初始化,我一直了解到这是不允许的。当我尝试编译该程序时,因此出现错误。像这样的代码首先应该如何编译?
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//Prints the Longest common subsequence
void printLCS(char *s1, char *s2, int m, int n);
/* Driver program to test above function */
int main()
{
char s1[] = "ABCBDAB";
char s2[] = "BDCABA";
printLCS(s1, s2, strlen(s1), strlen(s2));
return 0;
}
void printLCS(char *s1, char *s2, const int m, const int n)
{
int L[m + 1][n + 1];
//Building L[m][n] as in algorithm
for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (s1[i - 1] == s2[j - 1])
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
//To print LCS
int index = L[m][n];
//charcater array to store LCS
char LCS[index + 1];
LCS[index] = '[=10=]'; // Set the terminating character
//Stroing characters in LCS
//Start from the right bottom corner character
int i = m, j = n;
while (i > 0 && j > 0)
{
//if current character in s1 and s2 are same, then include this character in LCS[]
if (s1[i - 1] == s2[j - 1])
{
LCS[index - 1] = s1[i - 1]; // Put current character in result
i--; j--; index--; // reduce values of i, j and index
}
// compare values of L[i-1][j] and L[i][j-1] and go in direction of greater value.
else if (L[i - 1][j] > L[i][j - 1])
i--;
else
j--;
}
// Print the LCS
cout << "LCS of " << s1 << " and " << s2 << " is " << endl << LCS << endl;
}
特别是数组 L
和数组 LCS
的声明。
抱歉,如果这段代码一团糟,我真的 post 不在这里。任何帮助将不胜感激。
大多数人使用的 GCC 编译器中有一个允许可变长度数组的非标准扩展。不过你真的不应该使用它,因为 VLA 有 a lot of downsides,这就是为什么它们首先不在 C++ 标准中的原因。此外,当您的程序由于试图在堆栈上创建一个大数组而接收到大量输入时,您可能最终会导致堆栈溢出。
使数组大小不变或使用 std::vector
。
添加 #include <cstring>
(对于 strlen()
)
让我能够编译它:http://cpp.sh/3gwwd
和输出
LCS of ABCBDAB and BDCABA is
BDAB
哪个是正确的,不是吗? (我不知道 LCS)[http://lcs-demo.sourceforge.net/]
当性能不是绝对优先时,您可以考虑使用 std::vector<char>
,它的障碍要少得多(您还包含了矢量 class 但没有使用它?)