2017-09-01 47 views
-1

這是leetcode 14. 由於leetcode只給出一小部分代碼而沒有完整的圖片。我無法弄清楚我的代碼有問題。該錯誤消息不能精確定位到一行。 請幫我看看出了什麼問題。引用綁定到類型爲'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

所以你有一個錯誤,我們應該猜測什麼?請嘗試製作[mcve]。請在下面重複您的評論):未將您標記爲(尚未) - 如果您無法確定錯誤的位置,我們如何幫助您。 –

+0

在您標記之前,您是否閱讀我的文章?我提到它沒有針對一條線,否則我甚至不會來這裏問。 – cxf54

+3

順便說一句,你的'string longestCommonPrefix(vector &strs)'* member-function * **失敗**返回一個值。 – WhiZTiM

回答

0

代碼的第一行在其中有一個潛在的錯誤。另外爲什麼你不使用標準算法?與算法這樣做肯定會幫助你避免常見的錯誤......

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

爲了獲得最短的字符串在字符串中的向量,使用STL算法,可能看起來有點像這樣,並做了很多的速度比

#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(),因爲它在每次調用它時分配內存。