引用绑定到'struct value_type'类型的空指针

时间:2017-09-01 20:47:54

标签: c++ string

这是leetcode 14。 由于leetcode只提供一小部分代码而没有完整的图片。我无法弄清楚代码的问题。错误消息未指向一行。 请帮我看看出了什么问题。

这是为了在向量中存储的一串字符串中找到最长的公共前缀字符串。 我的想法是首先找到所有字符串中最短的字符串长度。然后我迭代这个并检查所有字符串是否具有相同的前缀。如果不是,则返回上一循环中的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);
                }
            }
        }
    }
};

1 个答案:

答案 0 :(得分: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(),因为每次调用它都会分配内存。