Создание массива с непостоянными размерами

В настоящее время я работаю над заданием, в котором я должен найти способ вывести самую длинную общую подпоследовательность из двух строк. Во всех других местах, где я нашел реализации этого кода, все они имеют одно сходство: множественные массивы инициализируются непостоянными переменными, которые я всегда изучал, не допускалось. Когда я попытался скомпилировать программу, я получил ошибку из-за этого. Как подобный код вообще должен компилироваться?

#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,

Извините, если этот код беспорядок, я действительно не публикую здесь. Любая помощь будет принята с благодарностью.

-5

Решение

В компиляторе GCC используется нестандартное расширение, которое позволяет использовать массивы переменной длины. Вы действительно не должны использовать это, хотя, потому что VLA имеют много минусов, именно поэтому они не соответствуют стандарту C ++. Кроме того, вы, вероятно, получите переполнение стека, когда ваша программа получит большой ввод из-за попытки создать большой массив в стеке.

Сделайте ваши массивы постоянного размера или использовать std::vector,

0

Другие решения

добавление #include <cstring> (за strlen())
позволяет мне скомпилировать это: http://cpp.sh/3gwwd
и выводы

LCS of ABCBDAB and BDCABA is
BDAB

что правильно, не так ли? (Я не знаю про LCS) [http://lcs-demo.sourceforge.net/]

Когда производительность не является абсолютным приоритетом, вы можете рассмотреть возможность использования std::vector<char> что связано с гораздо меньшими препятствиями (также вы включили векторный класс, но не использовали его?)

0

По вопросам рекламы [email protected]