HackerRank - 无前缀设置未通过所有测试用例

时间:2015-09-08 08:50:32

标签: java data-structures trie

我试图解决HackerRank上的No Prefix Set问题。我的解决方案只传递了一半的测试用例。我没有得到我在这里失踪的东西。

问题陈述:给定N个字符串。每个字符串仅包含a−j的小写字母(包括两者)。如果没有字符串是另一个字符串的前缀,那么N个字符串的集合被称为 GOOD SET ,它是 BAD SET

例如:aababcdeaabcd BAD SET ,因为aab是前缀aabcd

这是我实施的逻辑。

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");
}

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

输出:
如果设置有效,则输出 GOOD SET 否则,输出 BAD SET ,然后输入条件失败的 first string

示例:
4
AAB
AAC
aacghgh
aabghgh

输出继电器:
BAD SET
aacghgh

1 个答案:

答案 0 :(得分:1)

让它变得简单 -

  1. 从给定的集合中生成一个排序列表。
  2. 迭代这个列表,对于列表中的每个元素,只检查下一个元素startsWith()这个元素。如果是,则返回BAD SET。
  3. 如果步骤2永远不会返回BAD SET,则返回GOOD SET。
  4. 复杂性 - >因排序而导致O(n * log n)。