Total Accepted: 102743
Total Submissions: 360716
Difficulty: Easy
Write a function to find the longest common prefix string amongst an array of strings.
Subscribe to see which companies asked this question
Have you met this question in a real interview?
Yes
No
然后拿strs[0]开始与其他字符串遍历比较,不断缩小initCommonLen的值,最后按Len产生result string并返回。
于是第一版本的代码就有了
int initLen = 0;
for (int j = 0; strs[0][j] != '0' && strs[1][j] != '\0'; j++)
.....
.....
Run Code后提示Runtime Error,这才意识到可能有零输入或1个输入的情况下,strs[0] 或 strs[1] 将会是野指针(是这样说的吗?),指向没有意义的地址。
于是添加了过滤条件
if (strs.size() == 0)
return "";
if (strs.size() == 1)
return strs[0];
后面经过一系列Submit,WA,Edit,Submit,WA……循环之后,终于改出了AC的比较好看的版本
string longestCommonPrefix(vector<string>& strs) {
int initLen = 0;
if (strs.size() == 0)
return "";
if (strs.size() == 1)
return strs[0];
for (int j = 0; j < strs[0].size() && j < strs[1].size(); j++)
{
if (strs[0][j] == strs[1][j])
initLen++;
else
break;
}
for (int i = 2; i < strs.size(); i++)
{
int j = 0;
for ( ;j < strs[i].size() && j < initLen; j++)
{
if (strs[0][j] != strs[i][j])
break;
}
initLen = j;
}
if (initLen == 0)
return "";
string reslt;
for (int i = 0; i < initLen; i++)
{
reslt += strs[0][i];
}
return reslt;
}
值得注意的是,
1,用一个字符串给另一个字符串逐个赋值时,应使用上述代码的形式。reslt[i] = strs[0][i] 是不正确的。。在运行时会报错。“string subscript out of range”。
2,验证strs[i][j] 是否等于 \0,不如直接用 j < strs[i].size(); string str; str.size()将返回str的长度。
3,最后对reslt的赋值过程可以用 reslt = strs[0].substr(0, initLen) 代替。
看到Discuss中比较简洁的一篇代码如下:
if(strs.empty()) return "";
string tmp = strs[0];
int count = tmp.size();
for(int i = 1;i < strs.size();++i){
for(int j = 0;j < count;++j){
if(strs[i][j] != tmp[j]){
tmp = tmp.substr(0,j);
count = j;
break;
}
}
}
return tmp;
此外,提出一个问题,C++的代码在LeetCode中的速度最快是4ms吗?为什么在Discuss中看得到0ms或者快于4ms的其他语言结果,却没人写出快于4ms的C++代码呢?