n00*_*d3r 5 string algorithm data-structures
我在考虑以下问题:给定一个字符串S,让第i 个子字符串的长度为l i,第i 个子字符串的出现次数为o i.打印子字符串,使l i*o i最大化.
我有这个问题的O(n 3)解决方案(蛮力),我生成所有子串并找到具有最大值的子串.我的代码如下:
public static void solve(String S) {
    long max = Integer.MIN_VALUE;
    String res = "";
    for (int i = 0; i < S.length(); i++) {
        for (int j = 1; j <= S.length() - i; j++) {
            String s = S.substring(i, i + j);
            int o = countOccurrences(S, s);
            long p = (long) o * (long) s.length();
            if (max < p) {
                max = p;
                res = s;
            }
        }
    }
    System.out.println(res);
}
其中countOccurrences()方法需要O(n)时间.我想知道是否有更有效的方法来实现这一目标.
这是一个线性时间算法:
关键点是
也可以使用后缀数组而不是后缀树来完成此操作,在这种情况下,可能需要一个常数因子更少的内存,但会为运行时间添加一个对数因子。