这是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);
}
}
}
}
};
答案 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(),因为每次调用它都会分配内存。