给定一个字符串:“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)的问题.
你不能在这里使用正则表达式 – 它们旨在解决完全不同的任务.
至于如何使用解决方案查找长度介于x和y之间的最长子串的问题,只需修改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,algorithm,string
来源: https://codeday.me/bug/20190625/1286028.html