14.最长公共前缀(分治法)

这种简单题答案还是挺多的,可以看下官方给的一些解答参考,也算增长下知识,开拓下思路,除了那个什么树,其他都挺常规的感觉。 

C++代码:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()==0) return "";
        if(strs.size()==1) return strs[0];
        int idx = 0;
        bool flag = true;
        while(idx<strs[0].length()){
            for(string str : strs){
                if(str[idx] != strs[0][idx]){
                    flag = false;
                    break;
                }
            }
            if(flag==true){
                idx++;
            }else{
                break;
            }
        }
        if(idx == 0){
            return "";
        }else{
            return strs[0].substr(0, idx);
        }
        
        
    }
};

Python3代码:分治思想

Example: strs = ["adsfd","adhghh", "adhfdf", "adfkdsjg", "adfkfj", "adfhg"]

class Solution:
    def __commonPrefix__(self, left: str, right: str) -> str:
        '''
        求两个字符串的最大公共子串
        '''
        i = 0
        while(i<min(len(left), len(right))):
            if(left[i] != right[i]):
                return left[:i]
            else:
                i += 1
        return left if len(left)<len(right) else right

    def __longestCommonPrefix__(self, strs: List[str], l: int, r: int) -> str:
        '''
        分治法核心,类似于归并排序
        将多个字符串,按照2分等分原则,依次分成左右两份
        分别计算每个小份左右的最长公共字串,依次左右合并
        最后计算整个左右合并的字符串的公共子串
        '''
        if l==r:
            return strs[l]
        else:
            mid = (l + r) // 2
            lcpLeft = self.__longestCommonPrefix__(strs, l, mid)#求左边最长公共子串
            lcpRight = self.__longestCommonPrefix__(strs, mid+1, r)#求右边最长公共子串
            return self.__commonPrefix__(lcpLeft, lcpRight)#求整个最长公共子串
        
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs)==0:
            return ""
        return self.__longestCommonPrefix__(strs, 0, len(strs) - 1)
        
        

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值