#14. Longest Common Prefix

题目描述:

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));
        }
    }
};

横线扫描和纵向扫描复杂度差不多,但是纵向扫描可以生成一个临时字符矩阵,方便一些,分治法就是明显的用空间换时间了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值