[L14] 最长公共前缀【暴力,排序,分治】

复杂度 字符串平均长度m,数目n

单对这个题来说,最核心的就是拿到两个字符串的公共前缀,下面是方法
复杂度 m

    public static String conquer(String s1,String s2) {
        int i;
        int min = Math.min(s1.length(),s2.length());
        for ( i = 0; i < min; i++) {
            if(s1.charAt(i)!=s2.charAt(i)){
                break;
            }
        }
        return s1.substring(0,i);
    }

第一个念头就是暴力 m*n

    public static String longestCommonPrefix1(String[] strs) {
        String res = strs[0];
        int len = strs.length;
        for (int i = 0; i < len; i++) {
            String str = strs[i];
            res = conquer(str,res);
        }
        return res;
    }

然后题解中看到一个很好的思路,通过对字符串进行排序,first 和 last一定前缀相差数最多,只要拿到这两个的公共前缀,就可以了。
复杂度和排序相关

      public static String longestCommonPrefix2 (String[]strs){
            if (strs.length == 0) return "";
            Arrays.sort(strs);
            String first = strs[0];
            String last = strs[strs.length - 1];
            return conquer(last,first);
        }

分治也是题解看到的,这个题分治不是最优解 m*n
排序return是在s>e时,这样它能在上一层拿到s,e从而取到值,这个题是在分到只有一个元素时时返回这个值。
感觉一个题只有适用于结合律,它才可以归并。例如

min(a,b,c) = min(min(a,b),c);
//    分治,递归
        public static String longestCommonPrefix3 (String[]strs){
            return divide(strs, 0, strs.length - 1);
        }
        //分
        public static String divide (String[]strs,int s, int e){
            if (s == e) return strs[s];
            int mid = (s + e) / 2;
            String s1 = divide(strs, s, mid);
            String s2 = divide(strs, mid + 1, e);
            return conquer(s1, s2);

        }
        //治
        public static String conquer (String s1, String s2){
            int i;
            int min = Math.min(s1.length(), s2.length());
            for (i = 0; i < min; i++) {
                if (s1.charAt(i) != s2.charAt(i)) {
                    break;
                }
            }
            return s1.substring(0, i);
        }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值