题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
方法一:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
{
return "";
}
string s = strs[0];
//s存储公共前缀
for (int i = 1; i < strs.size(); i++)
{
string temps = "";
for (int j = 0; j < min(s.size() , strs[i].size()); j++)
//对每个字符串进行一对一的字符判断
{
if (s[j] == strs[i][j])
{
temps += s[j];
}
else
{
break;
}
}
s = temps;
if (s == "")
//如果公共前缀已经为空,就退出
{
break;
}
}
return s;
}
};
简单无脑的方法,执行时间有点长
时间复杂度:O(mn),n为字符串个数,m为字符串平均长度
方法二:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
{
return "";
}
sort(strs.begin() , strs.end());
string be = strs[0];
string en = strs.back();
int i;
for(i=0 ; i<min(be.size() , en.size()) ; i++)
{
if(be[i] != en[i])
{
break;
}
}
return string(be , 0 , i);
}
};
一种很巧妙的解法,先将字符串进行排序,然后再找出第一个字符串和最后一个字符串的公共前缀,就是所有字符串的公共最长前缀,因为排序的过程可以理解为就是对字符串分类的过程。
时间复杂度:O(nlogn+m)