如何提取字符串列表中最常见的字符?

时间:2013-08-10 16:26:12

标签: java string

假设我有以下字符串对象列表:

ABC1, ABC2, ABC_Whatever

从此列表中提取最常见字符的最有效方法是什么?所以在我的情况下我会得到 ABC

7 个答案:

答案 0 :(得分:6)

来自Apache Commons Lang的

StringUtils.getCommonPrefix(String... strs)

答案 1 :(得分:0)

这对你有用

 public static void main(String args[]) {
    String commonInFirstTwo=greatestCommon("ABC1","ABC2");
    String commonInLastTwo=greatestCommon("ABC2","ABC_Whatever");
    System.out.println(greatestCommon(commonInFirstTwo,commonInLastTwo));
}

public static String greatestCommon(String a, String b) {
    int minLength = Math.min(a.length(), b.length());
    for (int i = 0; i < minLength; i++) {
        if (a.charAt(i) != b.charAt(i)) {
            return a.substring(0, i);
        }
    }
    return a.substring(0, minLength);
}

答案 2 :(得分:0)

您散列给定列表中单词的所有子字符串并跟踪这些子字符串。具有最大出现次数的那个是您想要的那个。这是一个示例实现。它返回最常见的子字符串

static String mostCommon(List<String> list) {
    Map<String, Integer> word2Freq = new HashMap<String, Integer>();
    String maxFreqWord = null;
    int maxFreq = 0;
    for (String word : list) {
        for (int i = 0; i < word.length(); ++i) {
            String sub = word.substring(0, i + 1);
            Integer f = word2Freq.get(sub);
            if (f == null) {
                f = 0;
            }
            word2Freq.put(sub, f + 1);
            if (f + 1 > maxFreq) {
                if (maxFreqWord == null || maxFreqWord.length() < sub.length()) {
                    maxFreq = f + 1;
                    maxFreqWord = sub;
                }
            }
        }
    }

    return maxFreqWord;
}

如果您有多个公共子字符串,则上述实现可能还不够。使用其中的地图。

System.out.println(mostCommon(Arrays.asList("ABC1", "ABC2", "ABC_Whatever")));
System.out.println(mostCommon(Arrays.asList("ABCDEFG1", "ABGG2", "ABC11_Whatever")));

返回

ABC
AB

答案 3 :(得分:0)

您的问题只是找到longest common prefix

的标准问题的重新定义

答案 4 :(得分:0)

如果您知道常见字符是什么,那么您可以使用.contains()方法检查其他字符串是否包含这些字符。

答案 5 :(得分:0)

如果您愿意使用第三方库,则以下使用jOOλ为您生成该前缀:

String prefix = Seq.of("ABC1", "ABC2", "ABC_Whatever").commonPrefix();

免责声明:我为jOOλ背后的公司工作

答案 6 :(得分:-1)

如果有N个字符串并且它们中的最小长度是M个承租人,则在最坏情况下(当所有字符串相同时),最有效(正确)的答案将采用N * M.

outer loop - each character of first string at a time
inner loop - each of the strings
test       - each charterer of the string in inner 
             loop against the charterer in outer loop.

如果我们不测试内部循环中的第一个字符串,性能可以调到(N-1)* M