Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在两倍大的字符串中查找字符串_Java_Arrays_Search - Fatal编程技术网

Java 在两倍大的字符串中查找字符串

Java 在两倍大的字符串中查找字符串,java,arrays,search,Java,Arrays,Search,我想看看数组中每个相邻数字之间的差值是否与另一个数组相同,或者是它的旋转 A = {1,2,4}, so the differences are {1,1,2} B = {4,6,7}, the differences are {1,2,1} 如果将{1,2,1}中的所有元素顺时针移动一个元素,则结果为{1,1,2},这是正确的 到目前为止,我将差异转换为字符串,然后查看第二个数组的差异是否在第一个数组中找到,并将其自身连接起来 valid if "1 2 1" is in "1 1 2 1

我想看看数组中每个相邻数字之间的差值是否与另一个数组相同,或者是它的旋转

A = {1,2,4}, so the differences are {1,1,2}
B = {4,6,7}, the differences are {1,2,1}
如果将{1,2,1}中的所有元素顺时针移动一个元素,则结果为{1,1,2},这是正确的

到目前为止,我将差异转换为字符串,然后查看第二个数组的差异是否在第一个数组中找到,并将其自身连接起来

valid if "1 2 1" is in "1 1 2 1 1 2"
到目前为止,我的代码是这样的 count是数组的长度,两者的长度相同

    int c = count - 1;
    StringBuilder b1 = new StringBuilder();
    StringBuilder b2 = new StringBuilder();
    for (int i = 0; i < c; i++) {
        b1.append(array1[i + 1] - array1[i]);
        b1.append(" ");
        b2.append(array2[i + 1] - array2[i]);
        b2.append(" ");
    }
    b1.append((array1[0] - array1[c]) + d);
    b1.append(" ");
    b2.append((array2[0] - array2[c]) + d);

    String a2 = b2.toString();
    String a3 = b1.toString() + b1.toString();

    System.out.println(a3.contains(a2) ? "valid" : "not valid"); //bottleneck here
int c=count-1;
StringBuilder b1=新的StringBuilder();
StringBuilder b2=新的StringBuilder();
对于(int i=0;i

我的问题是,当我使用大数组(最多250000个元素)时,我在.contains()的最后一行遇到了一个巨大的瓶颈。我想知道是否有一种比我正在使用的方法更快的方法来检查它是否在方法内部,或者我是否可以在构建字符串时进行检查,或者是否有一种完全不同的方法来执行此操作?

您需要一种比
中使用的包含
方法更有效的算法(这实际上取决于具体的实现,但在您使用的Java版本中,它似乎效率不高)。

您可以使用Knuth-Morris-Pratt算法:。在最坏的情况下,它具有线性时间和空间复杂性,因此即使对于非常大的数组,它也可以快速工作。请注意,不需要将数组转换为字符串,因为此算法也适用于数组。

“rotate shift{1,2,1}…”是一个不正确的语句-您想将其表述为-“如果我将元素顺时针移动一个位置。”旋转移位是一个非常不同的野兽。编辑文章。“字符串中的字符串。”"也称为字符串异常。您是否尝试使用
Short
而不是字符串?原因是您的数组中似乎只有个位数-因此您可能可以处理
Short
而不是转换为字符串?我想您尝试了
Integer
,但由于数组太大而失败了?可能是
Short
会有所不同。此外,您可能可以使用
ArrayList
使用索引将差异保存在那里。然后您可以按顺序将它们取出。数字可能在0到50万之间,我将进一步研究,我尝试实现伪代码,但我无法让它提供正确答案用数组试过了