Java HackerRank-没有前缀集,无法通过所有测试用例
我试图解决HackerRank上的问题。我的解决方案只通过了一半的测试用例。我没有得到我在这里错过的东西 问题陈述:给定N个字符串。每个字符串只包含Java HackerRank-没有前缀集,无法通过所有测试用例,java,data-structures,trie,Java,Data Structures,Trie,我试图解决HackerRank上的问题。我的解决方案只通过了一半的测试用例。我没有得到我在这里错过的东西 问题陈述:给定N个字符串。每个字符串只包含a中的小写字母−j(包括两者)。N个字符串的集合称为好集合,如果没有字符串是另一个字符串的前缀,则称为坏集合 例如:,aab,abcde,aabcd是坏集,因为aab是aabcd的前缀 这是我实现的逻辑。 输入: 第一行包含N,即集合中的字符串数。 接下来是N行,其中第i行包含第i个字符串 输出: 如果集合有效,则输出良好集合。 否则,输出错误集
a中的小写字母−j
(包括两者)。N个字符串的集合称为好集合,如果没有字符串是另一个字符串的前缀,则称为坏集合
例如:,aab
,abcde
,aabcd
是坏集,因为aab
是aabcd
的前缀
这是我实现的逻辑。
输入:
第一行包含N,即集合中的字符串数。
接下来是N行,其中第i行包含第i个字符串 输出:
如果集合有效,则输出良好集合。
否则,输出错误集,然后是条件失败的
第一个字符串
示例:4
aab
aac
aacghgh
aabghgh 输出:
设置错误
aacghgh简单点-
startsWith()
this元素。如果是,返回坏集复杂度->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");
}