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();
}
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 楼答案
我想这取决于你要寻找的序列的长度
我要做的是使用Guava ^{} ,迭代序列,将所有子序列写入Multiset,并按出现次数排序。下面是一个示例实现:
关于性能:这种测试方法在我的机器上不受限制的长度大约需要一秒钟,当我将图案长度限制为12个字符时,大约需要25毫秒
# 2 楼答案
对于给定长度的数字,您可以将它们全部放在ArrayList中,对它们进行排序,并计算重复的数量(它们将彼此相邻)。您将始终拥有少于1000个条目