2017-09-01 10 views
-1

これはリートコード14です。 リートコードは完全な画像なしでわずかなコードしか与えません。私は自分のコードの問題を理解できません。エラーメッセージは、1行には含まれません。 どうしたらいいか見てみましょう。'struct value_type'型のヌルポインタへの参照への参照

これは、ベクトルに格納された一連の文字列の中で最も長い共通接頭文字列を見つけることです。 私の考えは、最初にすべての文字列の中で最短の文字列の長さを見つけます。次に、これを繰り返して、すべての文字列が同じプレフィックスを持つかどうかをチェックします。そうでなければ、以前のループでsubstrを返します。

class Solution { 
public: 
    string longestCommonPrefix(vector<string>& strs) { 
     int min = strs[0].size(); 
     string prefix; 
     for(int i =0;i<strs.size();i++){ 
      if(strs[i] == "") return ""; 
      else{ 
       if(min > (strs[i].size())) 
        min = strs[i].size(); 
      } 
     } 
     for(int i=0;i<=min;i++){ 
      prefix=strs[0].substr(0,i); 
      for(int j=0;j<strs.size();j++){ 
       if(prefix.compare(strs[j].substr(0,i))){ 
        return prefix.substr(0,prefix.size()-1); 
       } 
      } 
     } 
    } 
}; 
+0

エラーがありますので、私たちはどのような行を推測すべきですか? make a [mcve]してください。下記のコメントをお寄せください):あなたにはまだマークされていません - エラーの場所を教えられない場合はどうすればお手伝いしますか? –

+0

あなたはマークする前に自分の投稿を読んでいますか?私はそれが1つの行に特定されなかったことを言いました、そうでなければ私はここに来ることもないでしょう。 – cxf54

+3

ところで、 'string longestCommonPrefix(ベクトル&strs)' * member-function * **は値を返すために失敗します。 – WhiZTiM

答えて

0

コードの最初の行に大きな誤りがあります。また、なぜ標準アルゴリズムを使用しないでください?アルゴリズムでこれを行うと、間違いなくこのようなビットを見ることができる、と

よりもはるかに高速に行うことが、STLのアルゴリズムを使用して、文字列のベクトルで最短の文字列を取得するには...あなたは一般的な間違いを避ける

class Solution { 
public: 
    string longestCommonPrefix(vector<string>& strs) 
    { 
     int min = strs[0].size(); // <-- this line fails if strs is empty. 
     //... 
    } 
}; 

に役立つだろう

#include <string> 
#include <vector> 
#include <algorithm> 
#include <string.h> 

using namespace std; 

inline bool shorter(const string& s1, const string& s2) 
{ 
    return s1.length() < s2.length(); 
} 

struct has_not_prefix 
{ 
    has_not_prefix(const string& s) : prefix_(s) {} 

    bool operator()(const string& s) 
    { 
     if (s.length() > prefix_.length()) 
      return false; 
     return strncmp(s.c_str(), prefix_.c_str(), prefix_.length()) != 0; 
    } 

private: 
    const string& prefix_; 
}; 

string longestCommonPrefix(vector<string>& strs) 
{ 
    vector<string>::iterator 
     shortest = min_element(strs.begin(), strs.end(), shorter); 

    if (shortest == strs.end() || shortest->empty()) 
     return ""; 

    string prefix; 
    prefix.reserve(shortest->length()); 
    prefix += (*shortest)[0]; 
    for (size_t i = 1; i < strs.front().length(); ++i) 
    { 
     prefix += (*shortest)[i]; 
     if (find_if(strs.begin() + 1, strs.end(), has_not_prefix(prefix)) != strs.end()) 
     { 
      prefix.resize(prefix.length() - 1); 
      break; 
     } 
    } 
    return prefix; 
} 

int main() 
{ 
    vector<string> v; 
    //... 

    string r = longestCommonPrefix(v); 

    //... 
    return 0; 
} 

[PS]それはあなたがそれを呼び出すたびにメモリを割り当てるので、string :: substr()を乱用しないでください。

関連する問題