2017-09-01 48 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(),因为它在每次调用它时分配内存。