Leetcode-easy-2 Longest common prefix

Qusetion

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

Solution 1 Horizontal scanning

作为算法小白,第一个想到的就是这种方法了。只要遍历比较全部数组中的字符串即可。

public class Solution {
    public String longestCommonPrefix(String[] strs) {
         if(strs.length == 0){
                return "";
            }
        if(strs.length == 1){
                return strs[0];
            }
        String prefix = strs[0];
        for(int i=1;i<strs.length;i++){
            if(strs[i].length() == 0){
                return "";
            }
            prefix = getCommonPrefix(prefix,strs[i]);
        }
        return prefix;
    }
    
    public String getCommonPrefix(String prefix, String string){
        String result="";
        int round = (prefix.length()<string.length())?prefix.length():string.length();
        for(int i =0;i<round; i++){
            if(prefix.charAt(i)==string.charAt(i)){
                result += prefix.charAt(i);
            }else{
                return result;
            }
        }
        return result;
    }
}

当然所用时间相当的长,22ms

Solution 2 Devide and Conquer

leetcode 的方法之一,基本想法是对数组二分比较。

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length ==0 || strs == null){
            return "";
        }
        return getPrefix(strs, 0, strs.length-1);
    }
    
    public String getPrefix(String[] strs, int l, int r){
        if(l == r){
            return strs[l];
        }
        int pivot = (l + r)/2;
        String left = getPrefix(strs, l, pivot);
        String right = getPrefix(strs, pivot+1, r);
        return getCommonPrefix(left, right);
    }
    
    public String getCommonPrefix(String left, String right){
        int maxPrefixLength = Math.min(left.length(), right.length());
        for(int i= 0;i<maxPrefixLength;i++){
            if(left.charAt(i)!= right.charAt(i)){
                return left.substring(0,i);
            }
        }
        return left.substring(0,maxPrefixLength);
    }
}

实测用时15ms

Solution 3 Binary

leetcode方法之一,对第一个字符串二分不断同后面的匹配。

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0)
        return "";
    int minLen = Integer.MAX_VALUE;
    for (String str : strs)
        minLen = Math.min(minLen, str.length());
    int low = 1;
    int high = minLen;
    while (low <= high) {
        int middle = (low + high) / 2;
        if (isCommonPrefix(strs, middle))
            low = middle + 1;
        else
            high = middle - 1;
    }
    return strs[0].substring(0, (low + high) / 2);
}

private boolean isCommonPrefix(String[] strs, int len){
    String str1 = strs[0].substring(0,len);
    for (int i = 1; i < strs.length; i++)
        if (!strs[i].startsWith(str1))
            return false;
    return true;
}
posted on 2017-02-28 15:52  MissCee  阅读(107)  评论(0编辑  收藏  举报