关于LeetCode中Longest Common Prefix一题的理解

题目如下:

Write a function to find the longest common prefix string amongst an array of strings.

    给定一个String类型数组,要求写一个方法,返回数组中这些字符串的最长公共前缀。举个例子:假如数组为["123","12","4"],经过这个方法返回的结果就应该是""。因为"123","12","4"并没有共同的前缀,虽然"123","12"的公共最长前缀是"12",但是这个公共前缀"12"与"4"没有公共前缀,所以最后返回的结果就是""。

    最简单的思路就是将str[0],当作临时最长公共前缀,然后用这个前缀依次和剩下的字符串进行前缀比较,都比较完后,就将最后得到的最新公共最长前缀返回即可。直接放已Accepted的代码,如下所示:

    public String longestCommonPrefix(String[] strs) {
        String result = strs.length==0?"":strs[0];
        for(int j=0;j<strs.length;j++){
            result = commonPrefix(result,strs[j]);
        }
        return result;
    }
    private String commonPrefix(String origin,String target){
        StringBuffer sb = new StringBuffer();
        int loop = origin.length()>=target.length()?target.length():origin.length();
        for(int i=0;i<loop;i++){
            if(origin.charAt(i) == target.charAt(i)){
                sb.append(origin.charAt(i));
            }else{
                break;
            }
        }
        return sb.toString();
    }
    然后是评论区的方法,有一个挺有意思的直接放代码了:

    public String longestCommonPrefix(String[] strs) {
        StringBuilder result = new StringBuilder();
        
        if (strs!= null && strs.length > 0){
        
            Arrays.sort(strs);
            
            char [] a = strs[0].toCharArray();
            char [] b = strs[strs.length-1].toCharArray();
            
            for (int i = 0; i < a.length; i ++){
                if (b.length > i && b[i] == a[i]){
                    result.append(b[i]);
                }
                else {
                    return result.toString();
                }
            }
        return result.toString();
    }
    以下是解释,直接引用原文了,非常精辟:“ Sort the array first, and then you can simply compare the first and last elements in the sorted array.

    然后是下面这种,有点偷鸡,利用了字符串的indexOf方法,通过返回位置是不是0判断是不是公共前缀,如果返回值不是0,就将这个临时公共前缀删除最后一个字符,在进行尝试,直到返回值为0为止,代码如下:

    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
            String pre = strs[0];
        for (int i = 1; i < strs.length; i++)
            while(strs[i].indexOf(pre) != 0)
                pre = pre.substring(0,pre.length()-1);
        return pre;
    }
    大致就是这么一些方法,如果有更好的,欢迎到评论区补充~





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值