题目描述:
Write a function to find the longest common prefix string amongst an array of strings.
很简单的一道题目,但是我写了3个不一样的版本,运行时间确实数倍之差。。贴代码如下:
版本1:
class Solution {
public:
string longestCommonPrefix(vector
&strs) {
int strSize = strs.size();
string ret;
if(strSize == 0) return ret;
int minLen = strs[0].size();
for(int i = 0 ; i < strSize; ++i)
{
if(strs[i].size() < minLen)
minLen = strs[i].size();
}
if(minLen == 0 )return ret;
char ch;
bool label = false;
for(int i = 0 ; i < minLen; ++i)
{
ch = strs[0][i];
label = false;
for(int j = 1 ; j < strSize ; ++j )
{
if(strs[j][i] != ch)label = true;
}
if(label)break;
ret += ch;
}
return ret;
}
};
这个版本的运行时间为 44 ms
版本2:
class Solution {
public:
string longestCommonPrefix(vector
&strs) {
if(strs.empty()) return string("");
int n = strs.size();
if(n == 1) return strs[0];
int min_len = strs[0].size();
for(int i = 1 ; i < n ; ++i)
{
if(strs[i].size() < min_len)
min_len = strs[i].size();
}
int i;
for(i = 0 ; i < min_len ; ++i)
{
char ch = strs[0][i];
bool label = false;
for(int j = 1 ; j < n ; ++j)
{
if(strs[j][i] != ch)
{
label=true;
break;
}
}
if(label)
{
break;
}
}
return strs[0].substr(0,i);
}
};
两者之间的区别便是:有无创建string ret返回字符串。。
[updated]版本3:使用字符数组,时间同样是16ms,代码如下:
class Solution {
public:
string longestCommonPrefix(vector
&strs) {
int strSize = strs.size();
//string ret;
if(strSize == 0) return string("");
int minLen = strs[0].size();
for(int i = 0 ; i < strSize; ++i)
{
if(strs[i].size() < minLen)
minLen = strs[i].size();
}
if(minLen == 0 )return string("");
char ch;
bool label = false;
const int len = minLen;
char ret[len+1];
int index= 0;
for(int i = 0 ; i < minLen; ++i)
{
ch = strs[0][i];
label = false;
for(int j = 1 ; j < strSize ; ++j )
{
if(strs[j][i] != ch)label = true;
}
if(label)break;
//ret.push_back(ch);
ret[index++] = ch;
}
ret[index] = '\0';
return string(ret);
}
};
总结:刷题不只是要正确,还要效率!!!