2016-09-28 3 views
-1

Так что это была проблема из CodeLeet, чтобы найти самую длинную палиндромную подстроку.Почему Visual Studio не поддерживает переменные для размера массива?

В интерфейсе codeleet это решение работает:

class Solution { 
public: 
string longestPalindrome(string s) { 
    int len = s.size(); 
     int P[len][len]; 
memset(P, 0, len*len*sizeof(int)); 
     int maxL=0, start=0, end=0; 
     for(int i =0; i< s.size(); i++){ 
      for(int j =0; j<i; j++){ 
        P[j][i] = (s[j] == s[i] && (i-j<2 || P[j+1][i-1])); 
        if(P[j][i] && maxL < (i-j+1)) 
        { 
         maxL = i-j+1; 
         start = j; 
         end = i; 
        } 
      } 
      P[i][i] =1; 
     } 
     return s.substr(start, end-start +1); 
    } 
}; 

Но когда пишут то же самое, как функции в Visual Studio:

string User::longestPalindromeStr(string s) { 
int len = s.size(); 
int P[len][len]; 
memset(P, 0, len*len * sizeof(int)); 
int maxL = 0, start = 0, end = 0; 
for (int i = 0; i< s.size(); i++) 
{ 
    for (int j = 0; j<i; j++) 
    { 
     P[j][i] = (s[j] == s[i] && (i - j<2 || P[j + 1][i - 1])); 
     if (P[j][i] && maxL < (i - j + 1)) 
     { 
      maxL = i - j + 1; 
      start = j; 
      end = i; 
     } 
    } 
    P[i][i] = 1; 
} 
return s.substr(start, end - start + 1); 
} 

он говорит для лена переменная: выражение должно иметь постоянное значение? Это какая-то проблема с идеей VIsual studio. Как я могу это решить?

+0

Возможный дубликат [Массивы переменной длины в C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –

ответ

2

Поскольку переменные длины массивов (объявления массива, которые используют переменные не constexpr), являются функцией C99, не функцией C++. Никакая версия C++ не предлагает их, и никакая версия Visual Studio не предоставляет эту особенность C99.

Если ваш код компилируется на других компиляторах C++, это связано с расширением языка C++, которое они предоставляют поверх стандарта C++.

0

Нет проблем с VS-компилятором. В C++ вы можете использовать new int[] для создания 1-мерного массива определенной длины выполнения, но new int[][] недоступен, если второе измерение не является постоянным выражением. Следующая попытка дает ошибку компилятора, что второе измерение должен быть постоянным выражением:

int len = 10; 
int **P = new int[len][len]; // error: non-constant expression as array bound (on 2nd dimension) 

Эта ссылка дает хороший обходной Copy 2D array using memcpy?.