Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 - Fatal编程技术网

Java 在字符串中查找置换的索引

Java 在字符串中查找置换的索引,java,Java,我刚刚尝试了一个编程挑战,但未能成功完成。规格是从系统中读取2行输入 由1-100个空格分隔的单词组成的列表,所有单词长度相同,长度在1-10个字符之间 一个长度不超过一百万个字符的字符串,其中只包含一次上述列表的排列。返回此排列在字符串中开始位置的索引 例如,我们可能有: dog cat rat abcratdogcattgh 3 其中,3是结果(由System.out打印) 列表中有重复的单词是合法的: dog cat rat cat abccatratdogzzzzdogcatratca

我刚刚尝试了一个编程挑战,但未能成功完成。规格是从
系统中读取2行输入

  • 由1-100个空格分隔的单词组成的列表,所有单词长度相同,长度在1-10个字符之间
  • 一个长度不超过一百万个字符的字符串,其中只包含一次上述列表的排列。返回此排列在字符串中开始位置的索引
  • 例如,我们可能有:

    dog cat rat
    abcratdogcattgh
    3
    
    其中,
    3
    是结果(由
    System.out
    打印)

    列表中有重复的单词是合法的:

    dog cat rat cat
    abccatratdogzzzzdogcatratcat
    16
    
    如果答案开头的单词以前没有出现过,我生成的代码就起作用了。在这里的第二个例子中,我的代码将失败,因为
    dog
    已经出现在答案从索引16开始的地方

    我的理论是:

  • 查找字符串中每个单词出现的索引
  • 提取此子字符串(因为我们有许多已知长度的已知单词,这是可能的)
  • 检查所有单词是否出现在子字符串中
  • 如果是,则返回该子字符串出现在原始字符串中的索引
  • 这是我的代码(应该是可编译的):

    导入java.io.BufferedReader;
    导入java.io.InputStreamReader;
    公共类解决方案{
    公共静态void main(字符串[]args)引发异常{
    BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
    String line=br.readLine();
    字符串[]l=line.split(“”);
    字符串s=br.readLine();
    int wl=l[0]。长度();
    int len=wl*l.长度;
    int sl=s.length();
    for(字符串字:l){
    int i=s.indexOf(单词);
    int z=i;
    //而(i!=-1){
    int y=i+len;
    
    if(y如果将字符串连接在一起并使用新字符串进行搜索

    String a = "dog"
    String b = "cat"
    String c = a+b; //output of c would be "dogcat"
    
    这样你就能克服狗在某处出现的问题

    但是如果catdog也是一个有效的值,这就不起作用了。

    这里有一种方法(伪代码)

    完成后,您将拥有一系列索引(匹配首字母的位置)。现在是棘手的部分。由于单词都是相同长度的,我们正在寻找一系列索引,它们在10个不同的“集合”中以相同的方式间隔。这有点乏味,但它应该在有限的时间内完成。请注意,这样做比持续比较字符串更快(比较数字显然比确保匹配完整字符串更快)。我会再次将其分为两部分-首先查找“10个匹配的任意序列”,然后“看看这是否是一个独特的排列”


    我希望这能让你开动脑筋。

    也许不是最好的优化版本,但是下面的理论能给你一些想法吗:

  • 计算行中所有单词的长度
  • 从列表中随机抽取一个单词,并找到其第一个单词的起始索引 发生
  • 取一个子串,其长度在该子串前后进行计数 索引(例如,如果索引为15,3个单词4个字母长,则采用 从15-8到15+11的子串)
  • 在删除先前随机单词的情况下复制单词列表
  • 检查[word_length]的附加/前置字母,查看它们是否正确 在列表中匹配一个生词
  • 若word与列表副本匹配,则将其从列表副本中删除并进一步移动
  • 如果找到所有单词,则断开循环
  • 如果未找到所有单词,请查找下一次出现的单词的起始索引 前面的随机词,返回到3
  • 为什么会有帮助:

    • 你选择哪个词开头并不重要,因为每个词 无论如何都需要参加成功的比赛
    • 您不必手动循环许多字符, 除非有很多近乎完全的错误匹配
    • 随着假设匹配的不断增长,列表副本上剩下的可供比较的单词越来越少
    • 还可以跟踪您访问过的最远索引,以便 有时限制拾取的子字符串的向后长度(因为 如果发生错误,则不能与您已经去过的地方重叠 彼此靠近)

    因为任何排列都可以,所以这并没有真正的帮助。
    String a = "dog"
    String b = "cat"
    String c = a+b; //output of c would be "dogcat"
    
    stringArray keys(n) = {"cat", "dog", "rat", "roo", ...};
    string bigString(1000000);
    L = strlen(keys[0]); // since all are same length
    int indices(n, 1000000/L); // much too big - but safe if only one word repeated over and over
    
    for each s in keys
      f = -1
      do:
        f = find s in bigString starting at f+1  // use bigString.indexOf(s, f+1)
        write index of f to indices
        until no more found
    
    sIndx = sort(indices(:))
    dsIndx = diff(sIndx);
    sequence = find {n} * 10 in dsIndx
    for each s in sequence
      check if unique permutation