有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在字符串中查找常见的序列

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

字符串是一个很长的数字序列,我想找出最常见的数字序列


共 (2) 个答案

  1. # 1 楼答案

    我想这取决于你要寻找的序列的长度

    我要做的是使用Guava ^{},迭代序列,将所有子序列写入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);
    }
    
  2. # 2 楼答案

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