用于n个字符串的最长公共子字符串的Java实现

时间:2013-06-17 14:42:36

标签: java suffix-array longest-substring longest-prefix

我需要找到n个字符串中最长的公共子字符串,并在我的项目中使用结果。

java中是否有现有的实现/库已经这样做了?

感谢您提前回复。

5 个答案:

答案 0 :(得分:5)

我们可以使用下面的代码来识别n个字符串中最长的公共子字符串

public static String identifyCommonSubStrOfNStr(String [] strArr){

    String commonStr="";
    String smallStr ="";        

    //identify smallest String      
    for (String s :strArr) {
        if(smallStr.length()< s.length()){
            smallStr=s;
        }
    }

    String tempCom="";
    char [] smallStrChars=smallStr.toCharArray();               
    for (char c: smallStrChars){
        tempCom+= c;

        for (String s :strArr){
            if(!s.contains(tempCom)){
                tempCom=c;
                for (String s :strAarr){
                    if(!s.contains(tempCom)){
                        tempCom="";
                        break;
                    }
                }
                break;
            }               
        }

        if(tempCom!="" && tempCom.length()>commonStr.length()){
            commonStr=tempCom;  
        }                       
    }   

    return commonStr;
}

答案 1 :(得分:5)

concurrent-trees怎么办?

这是 Maven Central 中可用的小型(~100 KB)库。该算法使用 Radix 后缀树的组合。已知其具有线性时间复杂度wikipedia)。

public static String getLongestCommonSubstring(Collection<String> strings) {
    LCSubstringSolver solver = new LCSubstringSolver(new DefaultCharSequenceNodeFactory());
    for (String s: strings) {
        solver.add(s);
    }
    return solver.getLongestCommonSubstring().toString();
}

答案 2 :(得分:1)

This页面几乎可以用很多语言提供您想要的内容。

public static int longestSubstr(String first, String second) {
    if (first == null || second == null || first.length() == 0 || second.length() == 0) {
        return 0;
    }

    int maxLen = 0;
    int fl = first.length();
    int sl = second.length();
    int[][] table = new int[fl][sl];

    for (int i = 0; i < fl; i++) {
        for (int j = 0; j < sl; j++) {
            if (first.charAt(i) == second.charAt(j)) {
                if (i == 0 || j == 0) {
                    table[i][j] = 1;
                }
                else {
                    table[i][j] = table[i - 1][j - 1] + 1;
                }
                if (table[i][j] > maxLen) {
                    maxLen = table[i][j];
                }
            }
        }
    }
    return maxLen;
}

答案 3 :(得分:0)

您可以尝试通过将其放入循环遍历所有字符串的循环来扩展维基百科(http://en.wikipedia.org/wiki/Longest_common_substring_problem)的版本。

答案 4 :(得分:0)

public String findLongestCommonSubstring(String source, String dest) {
    int table[][] = new int[source.length() + 1][dest.length() + 1];
    for (int col = 0; col < table[0].length; col++) {
        table[0][col] = 0;
    }

    for (int row = 0; row < table.length; row++) {
        table[row][0] = 0;
    }

    int max = 0;
    int index = 0;
    for (int row = 1; row < table.length; row++) {
        char sourceChar = source.charAt(row - 1);
        for (int col = 1; col < table[row].length; col++) {
            char destChar = dest.charAt(col - 1);
            if (sourceChar == destChar) {
                table[row][col] = table[row - 1][col - 1] + 1;
                if (table[row][col] > max) {
                    max = table[row][col];
                    index = row;
                }
            } else {
                table[row][col] = 0;
            }
        }
    }
    return source.substring(index - max, index);
}