您实施的称为 "trie"。您可能想查看现有的实现。
您用来存储子节点的东西称为哈希表,您可能希望使用标准实现并避免自己实现它,除非您有非常非常具体的理由这样做。您的实现有一些限制(例如字符范围)。
我认为,您的代码在方法中有一个错误has
:
...
else if (letter[val].flag==true || word.length()==1) {
return true;
}
如果该方法打算在字符串以word
then 开头的情况下返回 true,则不应检查flag
. 如果仅在完全匹配的情况下必须返回 true,则不应检查word.length()
.
最后,解决您的问题:不是最佳但最简单的解决方案是创建一个方法,该方法接受一个字符串并返回一个与该字符串匹配的节点以及一个由节点中的所有单词组成的方法。像这样的东西(未经测试):
class Tree {
...
public List<String> matches(CharSequence prefix) {
List<String> result = new ArrayList<>();
if(r != null) {
Node n = r._match(prefix, 0);
if(n != null) {
StringBuilder p = new StringBuilder();
p.append(prefix);
n._addWords(p, result);
}
}
return result;
}
}
class Node {
...
protected Node _match(CharSequence prefix, int index) {
assert index <= prefix.length();
if(index == prefix.length()) {
return this;
}
int val = prefix.charAt(index) - 'a';
assert val >= 0 && val < letter.length;
if (letter[val] != null) {
return letter[val].match(prefix, index+1);
}
return null;
}
protected void _addWords(StringBuilder prefix, List<String> result) {
if(this.flag) {
result.add(prefix.toString());
}
for(int i = 0; i<letter.length; i++) {
if(letter[i] != null) {
prefix.append((char)(i + 'a'));
letter[i]._addWords(prefix, result);
prefix.delete(prefix.length() - 1, prefix.length());
}
}
}
}