LeetCode-最长公共前缀(java实现)

    题目如图,

 

    最开始我的想法是利用双重for循环,对于相邻字符串的每个字符进行比较。例如"flower"和"flow",最长公共前缀就是'flo',利用一个计数器保存公共前缀的长度3;然后比较"flow"和"flight"的最长公共前缀,长度为2,也用计数器保存。最后在这个计数器数组中找到最小值,就是整个String数组中所有元素的最长公共前缀的长度。代码如下

public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)
            return "";
        if(strs == null ) {
            return null;
        }
        if(strs.length == 1) {
            return strs[0];
        }

        int minLength = Integer.MAX_VALUE;
        for (int i = 0; i < strs.length; i++) {
            if(minLength > strs[i].length()) {
                minLength = strs[i].length();
            }
        }
        if(minLength == 0)
            return "";

        int[] commons = new int[strs.length-1];
        for (int i = 0; i < strs.length-1; i++) {
            for (int j = 0; j < minLength; j++) {
                if(strs[i].charAt(j) == strs[i+1].charAt(j)) {
                    commons[i]++;
                }else
                    break;
            }
        }

        int longestCommonPrefix = Integer.MAX_VALUE;
        for(int i=0; i<commons.length; i++) {
            if(longestCommonPrefix > commons[i]) {
                longestCommonPrefix = commons[i];
            }
        }

        return strs[0].substring(0, longestCommonPrefix);
    }

    程序用时9ms,然后看到前面有个用时6ms的代码,研究一番觉得甚是巧妙 ,现在贴出来供诸君欣赏

public static String longestCommonPrefix(String[] strs) {
        int count = strs.length;
        String prefix = "";
        if(count != 0){
            prefix = strs[0];
        }
        for(int i=0; i<count; i++){
            //关键代码,不断的从后往前截取字符串,然后与之相比,直到startsWith()返回true
            while(!strs[i].startsWith(prefix)){
                prefix = prefix.substring(0, prefix.length()-1);
            }
        }
        return prefix;
    }

    代码巧妙的利用了java提供的函数,几乎是不费一兵一卒就拿下了这道题目。非常佩服[鼓掌!鼓掌]

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值