查找字符串中常见的序列

时间:2011-07-06 15:17:18

标签: java algorithm

如何在Java中找到字符串中常见的序列?

字符串是一长串数字,我想找到最常出现的数字序列。

2 个答案:

答案 0 :(得分:2)

我想这取决于你正在寻找的序列有多长。

我要做的是使用Guava Multiset,迭代序列,将所有子序列写入Multiset并按事件排序。这是一个示例实现:

public static String getMostFrequentSequence(final String input, final int patternLength) {
    final Multiset<String> multiset = HashMultiset.create();
    final int length = patternLength < 0 ? input.length() : Math.min(patternLength, input.length());
    for (int l = 2; l < length; l++) {
        for (int o = 0; o < input.length() - l; o++) {
            multiset.add(input.substring(o, o + l));
        }
    }
    return Ordering.from(new Comparator<Entry<String>>() {
        public int compare(final Entry<String> o1, final Entry<String> o2) {
            return
            ComparisonChain.start()
            .compare(o1.getCount(), o2.getCount())
            .compare(o1.getElement(), o2.getElement())
            .result();
        }
    }).max(multiset.entrySet()).getElement();
}

关于性能:当我将模式长度限制为12个字符时,此测试方法在我的机器上花费大约一秒钟无限长度和大约25毫秒

public static void main(final String[] args) throws Exception {
    final StringBuilder sb = new StringBuilder();
    final Random random = new Random();
    for (int i = 0; i < 1000; i++) {
        sb.append(random.nextInt(10));
    }
    final long t1 = System.currentTimeMillis();
    final String input = sb.toString();
    System.out.println(input);
    System.out.println(getMostFrequentSequence(input, -1));
    System.out.println(System.currentTimeMillis() - t1);
    final long t2 = System.currentTimeMillis();
    System.out.println(getMostFrequentSequence(input, 12));
    System.out.println(System.currentTimeMillis() - t2);
}

答案 1 :(得分:1)

对于给定长度的数字,您可以将所有数字放在ArrayList中,对它们进行排序并计算重复数量(它们将彼此相邻)您将始终拥有少于1000个条目。