java HackerRank -无前缀集未通过所有测试用例

8xiog9wr  于 2023-02-02  发布在  Java
关注(0)|答案(4)|浏览(140)

我试图解决No Prefix Set问题的HackerRank。我的解决方案是通过只有一半的测试用例。我没有得到我错过了这里。

    • 问题陈述:给定N个字符串。每个字符串仅包含从a−j(包括a−ja−j)开始的小写字母。N个字符串的集合称为GOOD SET如果没有字符串是另一个字符串的前缀,则称为BAD SET**。
    • 例如:aababcdeaabcd错误设置**,因为aabaabcd的前缀。

下面是我实现的逻辑。

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
阿拉伯银行
AAC

    • 产出:**

不良设置

l7wslrjt

l7wslrjt1#

问题是您只检查当前单词是否包含前一个单词作为前缀。
您还必须检查当前单词是否是Trie中已有单词的前缀。

oewdyzsn

oewdyzsn2#

让一切变得简单-
1.从给定的集合中创建一个排序列表。
1.遍历这个列表,对于列表中的每个元素,检查下一个元素是否是这个元素的startsWith()。如果是,返回BAD SET。
1.如果步骤2从未返回不良设置,则返回良好设置。
复杂度-〉O(n * log n)。

oxalkeyp

oxalkeyp3#

Python解决方案。
我实际上创建了一个树,每个节点有10个分支,分别对应字母a到j。我逐个字符地遍历每个单词来构建树。当我为一个单词构建分支时,如果我遇到一个标记为“isComplete”的节点,那么我知道这个单词有一个前缀。如果我到达了一个单词的结尾,而我所在的分支继续延伸,那么我知道这个词是另一个词的前缀,我返回这个词。

class Tree:
    def __init__(self, words):
        self.words = words
        self.root = Node(None)
        self.checkForPrefix()
        
        
    def checkForPrefix(self):
        for word in words:
            answer = self.insert(word)

            if answer is not None:
                print("BAD SET")
                print(answer)
                return
    
        print("GOOD SET")
        

    def insert(self, word):
        current = self.root
        
        for i in range(len(word)):
            c = word[i]
            
            if current.branches[self.indexOf(c)] != None and i == len(word) - 1:
                return word
            
            if current.branches[self.indexOf(c)] == None:
                current.branches[self.indexOf(c)] = Node(c)
            
            if current.branches[self.indexOf(c)].isComplete:
                return word
            
            if i == len(word) - 1:
                current.branches[self.indexOf(c)].isComplete = True
                
            current = current.branches[self.indexOf(c)]

        return None

    def indexOf(self, c):
        return ord(c) - 97
             
class Node:
    def __init__(self, value):
        self.value = value
        self.isComplete = False
        self.branches = [None] * (ord("j") - ord("a") + 1)    

def noPrefix(words):
    # Write your code here
    root = Tree(words)
apeeds0o

apeeds0o4#

public static void noPrefix(List<String> words) {
// here is the solution which worked for me in hackerrank. let me know if any 
// better suggestion
   HashSet<String> hashSet=new LinkedHashSet<String>();
    for (String curr : words) {
        if(hashSet.size()>1){
        for (String value : hashSet) {
          if(!curr.equalsIgnoreCase(value) 
          &&  curr.startsWith(value)){
              System.out.println("BAD SET");
              System.out.println(curr);
            return;
          }
        }
        }
        hashSet.add(curr);
    }
    System.out.println("GOOD SET");
}

相关问题