创建具有非恒定大小的数组

时间:2018-08-08 21:51:04

标签: c++ arrays multidimensional-array variable-length-array lcs

我目前正在从事一项作业,在该作业中,我必须找到一种方法来输出两个字符串的最长公共子序列。在所有其他地方,我都找到了此代码的实现,它们都具有一个相似之处:多个数组都是使用非常数变量初始化的,而我一直都不允许这样做。当我尝试编译程序时,因此出现错误。像这样的代码最初应该怎么编译?

#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] = '\0'; // 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的声明。

很抱歉,如果这段代码是一团糟,我真的不会在这里发布。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

大多数人使用的GCC编译器中有一个非标准扩展名,该扩展名允许使用可变长度数组。但是,您实际上不应该使用它,因为VLA具有a lot of downsides,这就是为什么它们最初不在C ++标准中的原因。另外,由于尝试在堆栈上创建大数组而导致程序收到大量输入时,您可能最终会导致堆栈溢出。

使数组的大小恒定或使用std::vector

答案 1 :(得分:0)

添加#include <cstring>(用于strlen()) 使我能够编译它:http://cpp.sh/3gwwd 和输出

LCS of ABCBDAB and BDCABA is 
BDAB

是正确的吗? (我不知道LCS)[http://lcs-demo.sourceforge.net/]

当性能不是绝对优先级时,您可以考虑使用std::vector<char>,它带来的障碍要少得多(还包括向量类,但没有使用它吗?)