Leetcode刷题笔记题解(C++):14. 最长公共前缀

最长公共前缀:必须是从第一个开始算起,如果第一个都不一样,则返回空

最新思路:取第一个字符串为前缀,然后依次与剩下的字符串去比较依次得出最新的前缀,比如

前缀与第二个字符串比较得出的前缀,再去与第三个字符串比较得出最新的前缀。。。。。

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        int size = strs.size();
        //判断有多少个字符串,0和1特殊处理
        if(size==0) return string("");
        else if(size==1) return strs[0];
        //取第一个字符串为目前的前缀
        string pre = strs[0];
        //当前的前缀与后面的字符串依次去比较得出最新的前缀
        for(int i=1;i<size;i++){
            //如果当前字符串为空,则返回空字符串
            if(strs[i].size()==0) return string("");
            //获得前缀字符串和当前字符串的长度
            int x = strs[i].size();
            int y = pre.size();
            //遍历两者的字符进行判断,如果不相等则截取下标为0到目前下标的字符串(不包含当前下标
            for(int j = 0;j<min(x,y);j++){
                if(strs[i][j]!=pre[j]) pre=pre.substr(0,j);
            }
        }
        return pre;

    }
};

思路一:从第一个与第二个开始求最长公共前缀,然后结果与第三个求最长公共前缀,如果中间遇到最长公共前缀没有,则跳出迭代,直接返回" "

代码如下:

class Solution {
public:
    string longestCommonPrefix1(vector<string>& strs) {
        if (!strs.size()) return "";
        if(strs.size()==1) return strs[0];

        //用来保存最长公共前缀
        string prestr=strs[0];
        int count=strs.size();

        //进行遍历寻找每次的最长公共前缀
        for(int i=1;i<count;i++){
            prestr=longestCommonPrefix(prestr,strs[i]);
            if(prestr==""){
                return "";//遇到最长公共前缀为空则直接返回
            }
        }
        return prestr;
    }
    //求2个字符串的最长公共前缀
    string longestCommonPrefix(const string& str1, const string& str2) {
        int length=min(str1.length(),str2.length());
        int index=0;
        while(index<length&&str1[index]==str2[index]){
            index++;
        }
        return str1.substr(0,index);
    }
};

思路二:分治思想,将整个字符串数组分成2块,再分成2块, 直到最小的两个单元进行求最长公共前缀

代码如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if (!strs.size()) return "";
        if(strs.size()==1) return strs[0];
        int count=strs.size();
        //进行分治求最长公共前缀
        string prestr=merge_deal(strs,0,count-1);
        return prestr;
        
    }

    //分治处理
    string merge_deal(vector<string>& strs,int start,int end){
        //分成了只剩一个字符串的字符串数组
        if(start==end) return strs[start];
        //分成了只剩两个个字符串的字符串数组
        if(end-start==1) return longestCommonPrefix(strs[start],strs[end]);
        int mid=(start+end)>>1;
        //分治处理
        return longestCommonPrefix(merge_deal(strs,start,mid),merge_deal(strs,mid+1,end));
    }

    //求2个字符串的最长公共前缀
    string longestCommonPrefix(const string& str1, const string& str2) {
        int length=min(str1.length(),str2.length());
        int index=0;
        while(index<length&&str1[index]==str2[index]){
            index++;
        }
        return str1.substr(0,index);
    }
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demo.demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值