最长公共前缀

转载 2018年04月17日 13:06:37

给k个字符串,求出他们的最长公共前缀(LCP)

样例
在 "ABCD" "ABEF" 和 "ACEF" 中, LCP 为 "A"

在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"

分析

方法一 : 横向遍历

以第一个string为标准,依次判断是否是前缀,如果不是就减一,直到为前缀。

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;
}

方法二:纵向遍历

从第一个字符开始遍历,知道找到所有字符串出现不一样的字符为止

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    for (int i = 0; i < strs[0].length() ; i++){
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j ++) {
            if (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
}

方法三:分治法

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";    
        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 lcpLeft =   longestCommonPrefix(strs, l , mid);
        String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
        return commonPrefix(lcpLeft, lcpRight);
   }
}

String commonPrefix(String left,String right) {
    int min = Math.min(left.length(), right.length());       
    for (int i = 0; i < min; i++) {
        if ( left.charAt(i) != right.charAt(i) )
            return left.substring(0, i);
    }
    return left.substring(0, min);
}

方法四:二分法

首先我们找出最短的字符串,最长的前缀的长度不会超过这个字符串。然后我们使用二分搜索的方式:

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;
}


作者:六尺帐篷
链接:https://www.jianshu.com/p/63dcc0d7db75
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

LintCode-最长公共前缀

给k个字符串,求出他们的最长公共前缀(LCP) 您在真实的面试中是否遇到过这个题?  Yes 样例 在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "...
  • wangyuquanliuli
  • wangyuquanliuli
  • 2015-06-25 18:55:33
  • 5948

LeetCode14. Longest Common Prefix(字典树:最长公共前缀)

题目链接:https://leetcode.com/problems/longest-common-prefix/ Write a function to find the longest ...
  • u012717411
  • u012717411
  • 2016-12-02 11:41:21
  • 423

字符串数组最长公共前缀

字符串数组最长公共前缀Longest Common Prefix Write a function to find the longest common prefix string amongst a...
  • github_37953781
  • github_37953781
  • 2017-06-23 16:39:04
  • 683

uva12338 - Anti-Rhyme Pairs 询问最长公共前缀 HASH+二分

Often two words that rhyme alsoend in the same sequence of characters. We use this property to defin...
  • corncsd
  • corncsd
  • 2015-01-03 17:53:45
  • 524

LintCode 78 最长公共前缀

题目:longestCommonPrefix要求:给k个字符串,求出他们的最长公共前缀(LCP)样例:在 “ABCD” “ABEF” 和 “ACEF” 中, LCP 为 “A” 在 “ABCDEF...
  • linglian0522
  • linglian0522
  • 2017-05-18 08:29:02
  • 385

lintcode ---- 最长公共前缀

思路:只要不相等就返回,否则res一直累加! string longestCommonPrefix(vector &strs) { // write your c...
  • u012850192
  • u012850192
  • 2016-06-16 13:38:58
  • 263

LintCode 最长公共前缀

最长公共前缀 给k个字符串,求出他们的最长公共前缀(LCP)样例 在 “ABCD” “ABEF” 和 “ACEF” 中, LCP 为 “A” 在 “ABCDEFG”, “ABCEFG”, “AB...
  • shinanhualiu
  • shinanhualiu
  • 2015-09-19 21:58:14
  • 522

LeetCode 14. 最长公共前缀

题目描述: 最长公共前缀        编写一个函数来查找字符串数组中最长的公共前缀字符串。解题思路:        用第一个字符串s,比较strs的每个字符串的公共前缀,并记录前缀有m位,之后输出s...
  • qq_33168253
  • qq_33168253
  • 2018-03-29 13:28:50
  • 13

hdu 4691 lcp最长公共前缀 后缀数组经典模板

每行无论公共前缀是多少,都要一个空格和换行,+2 注意公共前缀的长度 #include #include #include using namespace std; #define N 10...
  • Jackyguo1992
  • Jackyguo1992
  • 2013-08-21 16:45:28
  • 2304

lintcode python ——最长公共前缀(LCP)

问题描述:给k个字符串,求出他们的最长公共前缀(LCP) 样例 在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "A" 在 "ABCDEFG", "ABCEFG", "...
  • SEMPERFI_5407
  • SEMPERFI_5407
  • 2017-02-12 14:43:18
  • 344
收藏助手
不良信息举报
您举报文章:最长公共前缀
举报原因:
原因补充:

(最多只允许输入30个字)