leetcode刷题14

最长公共前缀

1.水平扫描法
public String longestCommonPrefix(String[] strs) {
   if (strs.length == 0) return "";
   String prefix = strs[0];
   for (int i = 1; i < strs.length; i++)
       while (strs[i].indexOf(prefix) != 0) {
           prefix = prefix.substring(0, prefix.length() - 1);
           if (prefix.isEmpty()) return "";
       }        
   return prefix;
}


作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。代码片

笔记:
在while循环中,判断条件的值可以为-1,0,以及其他值。
为-1时,说明当前公共前缀不满足当前字符串,则将前缀长度减一,继续循环
为0时,当前公共前缀正好也是该字符串的前缀,结束该轮循环
为其他值时,说明该公共前缀存在字符串中,但不是前缀,将前缀长度减一,继续循环

2.

采用暴力方法,对所有字符串依次比较

public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){
            return "";
        }
        String lcp = strs[0];
        for(int i = 1; i < strs.length; i++){
            if(lcp.length() == 0)
                return "";
            int j;
            for(j = 0; j < Math.min(strs[i].length(), lcp.length()); j++){
                if(lcp.charAt(j) != strs[i].charAt(j)){
                    break;
                }
            }
            lcp = lcp.substring(0,j);
        }
        return lcp;
    }

时间效率不是很高,内存消耗较多(部分原因:代码不精简)
运行结果分析:
123

3.分治法

分而治之,两两比较

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0){
            return "";
        }else{
            return longestCommonPrefix(strs, 0, strs.length - 1);
        }
    }

    private String longestCommonPrefix(String[] strs, int l, int r){
        if(l == r){
            return strs[l];
        } else{
            int mid = (l + r)/2;
            String leftPrefix = longestCommonPrefix(strs, l, mid);
            String rightPrefix = longestCommonPrefix(strs, mid + 1, r);
            return commonPrefix(leftPrefix, rightPrefix);
        }
    }

    private String commonPrefix(String leftPrefix, String rightPrefix){
        int len = Math.min(leftPrefix.length(), rightPrefix.length());
        String ans;
        for(int i = 0; i < len; i++){
            if(leftPrefix.charAt(i) != rightPrefix.charAt(i)){
                return leftPrefix.substring(0, i);
            }
        }
        return leftPrefix.substring(0, len);
    }
}

时间效率提高,数据量比较大时更显著。
运行结果分析:
在这里插入图片描述
题目来源于leetcode14 ,代码实现部分参考原网站题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值