java - 查找长度在 x 和 y 之间的最长重复子串

标签 java string algorithm

给定一个字符串:“blablafblafbla”和 2 个限制:x=3,y=5 我想找到长度在 x 和 y 之间的最长重复子串。如果有很多,第一个 在我的例子中是“blaf” 几个问题: 1.使用正则表达式更容易吗? 2.我知道如何找到最长的子串,但我必须在哪里设置条件才能使它位于 x 和 y 之间?

public static String longestDuplicate(String text)
{
    String longest = "";
    for (int i = 0; i < text.length() - 2 * longest.length() * 2; i++)
    {
        OUTER: for (int j = longest.length() + 1; j * 2 < text.length() - i; j++)
        {
            String find = text.substring(i, i + j);
            for (int k = i + j; k <= text.length() - j; k++)
            {
                if (text.substring(k, k + j).equals(find))
                {
                    longest = find;
                    continue OUTER;
                }
            }
            break;
        }
    }
    return longest;
}

最佳答案

您提供的代码是解决您遇到的问题的一种极其低效的方法。我将使用 Rabin-Karp 实现解决方案或其他一些滚动哈希算法,这将使您能够解决复杂度为 O((y-x) * L) 的问题。

您不能在此处使用正则表达式 - 它们旨在解决完全不同的任务。

关于如何使用您的解决方案 找到长度在xy 之间的最长子串的问题,只需修改循环j 仅考虑区间 [x, y] 中的值。以下是您可以如何做到这一点。

for (int j = Math.max(longest.length() + 1, x) ; j * 2 < text.length() - i && j < y; j++)

编辑:要找到最长的子串,反转 for 循环:

for (int j = Math.min((text.length() - i -1)/2, y) ; j > longest.length() && j >=x; j--) 

关于java - 查找长度在 x 和 y 之间的最长重复子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770085/

相关文章:

java - Android 反射注解失败

java - 将用户名传递给 HttpGet 请求

python - 如何将整数转换为逗号分隔的字符串

android - 如何在 Android 中获取前缀字符串值?

c++ - 散列数组的排列

java - Eclipse 中启动进程中的 OutOfMemory

java - 什么是 OutOfMemoryError 以及如何调试和修复它

arrays - 如何在我的数组中找到与正则表达式匹配的连续字符串?

arrays - 查找数组中的重复元素

algorithm - 如果 n=100 的 O(lg(n)) 算法需要 1 秒才能运行,那么如何计算 n=1000 需要多长时间?