2016-06-26 16 views
1

インタビュービットで一致するワイルドカードパターンでセグメンテーションフォルトが発生しましたが、今は回答が得られません。 私はDPを使用してタスクを解決しています。 私が問題にセグメンテーションフォルト リンクの理由を把握助けてください - ここでhttps://www.interviewbit.com/problems/regular-expression-match/ワイルドカードパターンマッチングのセグメンテーションフォルト

はC++でセグメンテーションフォルトを取得し、私のソリューションです。

あなたはデータ上の任意のカスタムアクションを必要としないので

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

に動的メモリを割り当てる必要が

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++の配列は、コンパイル時の式をエントリの数として宣言する必要があります。代わりに 'std :: vector'を使用してください。標準的なC++にするだけでなく、問題をデバッグするのに役立ちます。なぜなら、' vector'は境界から外れた場合に例外をスローする 'at()'関数を持っているからです。 )。 – PaulMcKenzie

+0

@EmrahIzci文字列の値が指定されていません! –

答えて

0

、ちょうど配列は十分です、ベクトルは必要ありません。

+0

あなたが話しているこの "カスタムアクション"とは何ですか? vectorが何らかのループを行うことなくメモリを動的に割り当て、 'new []'をあなたがしたように呼び出すということは、その目的のためです。また、あなたは 'delete []'について言及しておらず、どのように呼び出されなければなりません。 – PaulMcKenzie

+0

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

+0

ベクタが追加する唯一の機能は、問題を解決するためにプログラマが役立つことです。1)メモリを手動で管理する必要はなく、境界アクセスエラーをテストする 'at()'関数'new []'や普通の配列(さらには非標準のVLA)を使っても、このデバッグ機能はありません。そして、ポスターによると、問題はベクトルと 'at()'を使って解決されたようです。 – PaulMcKenzie

関連する問題