Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 HackerRank-没有前缀集,无法通过所有测试用例_Java_Data Structures_Trie - Fatal编程技术网

Java HackerRank-没有前缀集,无法通过所有测试用例

Java HackerRank-没有前缀集,无法通过所有测试用例,java,data-structures,trie,Java,Data Structures,Trie,我试图解决HackerRank上的问题。我的解决方案只通过了一半的测试用例。我没有得到我在这里错过的东西 问题陈述:给定N个字符串。每个字符串只包含a中的小写字母−j(包括两者)。N个字符串的集合称为好集合,如果没有字符串是另一个字符串的前缀,则称为坏集合 例如:,aab,abcde,aabcd是坏集,因为aab是aabcd的前缀 这是我实现的逻辑。 输入: 第一行包含N,即集合中的字符串数。 接下来是N行,其中第i行包含第i个字符串 输出: 如果集合有效,则输出良好集合。 否则,输出错误集

我试图解决HackerRank上的问题。我的解决方案只通过了一半的测试用例。我没有得到我在这里错过的东西

问题陈述:给定N个字符串。每个字符串只包含
a中的小写字母−j
(包括两者)。N个字符串的集合称为好集合,如果没有字符串是另一个字符串的前缀,则称为坏集合

例如:
aab
abcde
aabcd
坏集,因为
aab
aabcd
的前缀

这是我实现的逻辑。


输入:
第一行包含N,即集合中的字符串数。
接下来是N行,其中第i行包含第i个字符串

输出:
如果集合有效,则输出良好集合。
否则,输出错误集,然后是条件失败的
第一个字符串

示例:
4
aab
aac
aacghgh
aabghgh

输出:
设置错误
aacghgh

简单点-

  • 从给定集合中创建一个排序列表
  • 迭代此列表,对于列表中的每个元素,只需检查下一个元素
    startsWith()
    this元素。如果是,返回坏集
  • 如果步骤2从未返回坏集,则返回好集

  • 复杂度->O(n*logn)由于排序而增加。

    问题在于,您只检查当前单词是否包含前一个单词作为前缀


    您还必须检查当前单词是否是Trie中已有单词的前缀。

    我猜现有解决方案是O(n)。我只在字符串数组上迭代一次。最坏的情况是O(n),因为当我在另一个前缀中找到前缀时,它会输出消息并返回。这没有线性时间复杂度,
    startsWith()
    不是一个常数时间操作。通过对列表排序,我们将改变元素的顺序。输出应该是到目前为止我们处理的字符串列表中第一个具有前缀的元素。请检查问题页面上的示例Input01。@abhishekbafna-因为您的原始输入是一组,所以顺序无关紧要。但排序将使前缀比较更快,因为我们只需要与下一个项目进行比较。@RamanShrivastava我用另一个例子更新了这个问题。请查收。
    class Trie {
      Trie next[] = new Trie[10];
      boolean end[] = new boolean[10];
    }
    
    private static void goodOrBad(String[] array, Trie start) {
      for (String string : array) {
        Trie current = start;
        Trie previous = start;
        int index = 0;
        char strArray[] = string.toCharArray();
        for (char c : strArray) {
          index = c-'a';
          if (current.end[index]) {
            System.out.println("BAD SET");
            System.out.println(string);
            return;
          }
          if (current.next[index] == null) {
            Trie newTrie = new Trie();
            current.next[index] = newTrie;
            previous = current;
            current = newTrie;
          }
          else {
            previous = current;
            current = current.next[index];
          }
        }
        previous.end[index] = true;
      }
      System.out.println("GOOD SET");
    }