题目:
Write a function to find the longest common prefix string amongst an array of strings.
我的做法是,首先,先扫描一遍字符串数组,找到最短的字符串,时间复杂度为O(N)。然后把这个字符串的第1个字符作为标杆,在循环中依次检查数组中剩下的元素,看看是否第1个字符相等。如果循环完了数组的所有字符串,都发现它们的第1个字符相等,则向后比较第2个字符,以此类推直到比较完最短字符串的所有字符。如果在其中发现某个位置的字符出现不等,则跳出循环。这个过程的时间复杂度为O(K*N),假设最短字符串的长度为K。
class Solution {
public:
string longestCommonPrefix(vector<string> &strs) {
if(strs.size()==0)
return "";
string result="";
string candi=strs[0];
//1 扫描一遍,找到最短的str
for(unsigned int i=0;i<strs.size();i++) {
if(strs[i].length()<candi.length())
candi=strs[i];
}
unsigned int candi_len = (unsigned int)candi.length();
//2 逐渐比较
for(unsigned int j=0, i=0;j<candi_len;j++) {
for(i=0;i<strs.size();i++) {
if(strs[i][j]!=strs[0][j])
break;
}
if(i==strs.size()) {
result+=strs[0][j];
}else {
break;
}
}
return result;
}
};
一开始写的时候,忘了string可以直接重载+操作符了,所以很2地new了一个字符串数组然后去strcpy,o(╯□╰)o,所以下面这个版本非常啰嗦。。。。不过提交了一下看看,两个版本都是36ms的时间通过。可能测试数据量还不够大吧,要不然啰嗦版的运行时间肯定会大于简洁版。
//啰嗦的初版
class Solution {
public:
string longestCommonPrefix(vector<string> &strs) {
if(strs.size()==0)
return "";
string result=strs[0];
//1 扫描一遍,找到最短的str
for(unsigned int i=0;i<strs.size();i++) {
if(strs[i].length()<result.length())
result=strs[i];
}
unsigned int candi_len = (unsigned int)result.length();
if(candi_len==0)
return "";
unsigned int result_len = 0;
char* p_candi=new char[candi_len+1];
char* p_result=new char[candi_len+1];
strncpy(p_candi,result.c_str(),candi_len+1);
strncpy(p_result,"\0",candi_len+1);
//2 逐渐比较最短字符串的第i位和剩下字符串的第i位。
for(unsigned int j=0, i=0;j<candi_len;j++) {
for(i=0;i<strs.size();i++) {
if(strs[i][j]!=p_candi[j])
break;
}
if(i==strs.size()) {
result_len=j+1;
strncpy(p_result,p_candi,j+1);
}else {
break;
}
}
p_result[result_len]='\0';
result=p_result;
delete [] p_candi;
delete [] p_result;
return result;
}
};
update: 2014-11-16
//44ms
class Solution {
public:
string longestCommonPrefix(vector<string> &strs) {
if (strs.size() == 0) return "";
string base_string = strs[0]; //从strs中取一个string作为比较的基准。
string result = "";
for (int i = 0; i < base_string.length(); ++i) { //对于基准string的每一位
for (int j = 1; j < strs.size(); ++j) { //检查是否每个string都在基准string的每一位上相等
if (strs[j][i]!=base_string[i])
return result;
}
result = result + base_string.substr(i,1);
}
return result;
}
};
update; 2015-01-22
//12ms
class Solution {
public:
string longestCommonPrefix(vector<string> &strs) {
if (strs.size() == 0) return "";
string base_string = strs[0];
int index = -1;
for (int i = 0; i < base_string.length(); ++i) {
for (int j = 1; j < strs.size(); ++j)
if (strs[j][i]!=base_string[i])
return base_string.substr(0, index + 1);
index = i;
}
if (index == -1) return "";
else return base_string.substr(0, index + 1);
}
};