2016-06-26 2 views
1

Я получаю ошибку сегментации в шаблоне подстановочного шаблона в интервью. И я искал помощь, чтобы не получить ответа. Я использую DP для решения задачи. Пожалуйста, помогите мне выяснить причину Segfault Ссылка на проблему - https://www.interviewbit.com/problems/regular-expression-match/Ошибка сегментации в шаблоне совпадения шаблонов

Вот мое решение становится Segfault в C++.

int Solution::isMatch(const string &s, const string &p) { 

    int n=s.size(),m=p.size(); 
    bool dp[n+1][m+1]; 

    for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=false; 
    dp[0][0]=true; 

    for(int j=1;j<=m;j++) 
     if(p[j-1]=='*')dp[0][j]=dp[0][j-1]; 

    for(int i=1;i<=n;i++) 
    { 
     for(int j=1;j<=m;j++) 
     { 
     if(s[i-1]==p[j-1] || p[j-1]=='?')dp[i][j]=dp[i-1][j-1]; 
     else if(p[j-1]=='*') 
     { 
      int v1=dp[i][j-1],v2=0;// Not Using 
      v2=(dp[i-1][j]|dp[i][j-1]); 
      dp[i][j]=(v1|v2); 
     } 
     else dp[i][j]=false; 
     } 
    } 
    return dp[n][m]; 
} 
+0

похоже, что вы получаете его во время выполнения, каковы строковые значения, которые вызывают ошибку? –

+0

'bool dp [n + 1] [m + 1];' Это не законный C++, массивы в C++ должны быть объявлены с использованием выражений compile-time в виде числа записей. Вместо этого используйте 'std :: vector', а не только для того, чтобы сделать его стандартным C++, но чтобы помочь вам в отладке вашей проблемы, поскольку' vector' имеет функцию 'at()', которая генерирует исключение, если вы выходите за пределы (вместо этого от разлома seg). – PaulMcKenzie

+0

@EmrahIzci Строковые значения не указаны! –

ответ

0

Вы должны выделить динамическую память

bool** dp = new bool*[n+1]; 
for(bool i = 0; i < n+1; ++i) 
    dp[i] = new bool[m+1]; 

Поскольку вам не нужны какие-либо пользовательские действия на данные, просто массив будет достаточно, нет необходимости в векторе.

+0

Что это за «пользовательское действие», о котором вы говорите? Тот факт, что вектор динамически распределяет память без необходимости делать какие-либо петли и вызывать 'new []', как вы это сделали, - это то, для чего он предназначен. Кроме того, вы не упомянули 'delete []' и как это должно быть вызвано. – PaulMcKenzie

+0

http://www.cplusplus.com/reference/vector/vector/ –

+0

Единственная функция, которая добавляет вектор, которая помогает программисту в решении проблемы: 1) Не нужно вручную управлять памятью и, возможно, так же важно, 2) функция 'at()' для проверки ошибок пограничного доступа. Использование 'new []' или даже обычных массивов (и даже нестандартных VLA) не имеет этой функции отладки. И, согласно плакату, проблема решена из-за вектора и, возможно, с помощью 'at()'. – PaulMcKenzie