题目描述:
Write a function to find the longest common prefix string amongst an array of strings.
按照Leetcode的解题指南:
寻找字符串集合的公共前缀,搜索问题,直接搜索的话有两种方法横向扫描和纵向扫描,运用算法的话可以用分治法,运用数据结构的话可以用二叉树来搜索,不断地进行剪枝操作加快搜索(不是很懂,暂时没有写)。
横向扫描:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
string result = strs[0];
for(int i=0;i<strs.size();i++){
if(strs[i].size()>result.size()){
result = strs[i];
}
}
//cout<<"result = "<<result<<endl;
for(int i=0;i<strs.size();i++){
while(strs[i].find(result,0)!=0){
result.erase(result.length()-1);
//cout<<result<<endl;
}
//cout<<"result = "<<result<<endl;
}
return result;
}
};
纵向扫描:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
string result(""),minStr=strs[0];
for(int i=0;i<strs.size();i++){
if(strs[i].size()<minStr.size())
minStr = strs[i];
}
for(int i=0;i<minStr.size();i++){
for(int j=0;j<strs.size();j++){
string temp = strs[j];
//cout<<j<<" temp = "<<temp<<endl;
if(temp[i]!=minStr[i])
return result;
}
result.push_back(minStr[i]);
}
return result;
}
};
分治法:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)
return "";
else
return divideConquer(strs,0,strs.size()-1);
}
string commonPrefix(string a,string b){
string result("");
for(int i=0;i<a.size();i++){
if(a[i]!=b[i])
return result;
result.push_back(a[i]);
}
return result;
}
string divideConquer(vector<string>& strs,int start,int end){
int temp = (start+end)/2;
//cout<<"temp = "<<temp<<endl;
if(start==end)
{
return strs[start];
}else if((end-start)==1){
return commonPrefix(strs[start],strs[end]);
}else{
return commonPrefix(divideConquer(strs,start,temp),divideConquer(strs,temp+1,end));
}
}
};
横线扫描和纵向扫描复杂度差不多,但是纵向扫描可以生成一个临时字符矩阵,方便一些,分治法就是明显的用空间换时间了。