题目
解题思路
从读题我们就不难看出,这是一道考字典树的题,因为查询时有可能带有“.”,所以无法按暴力的方法直接匹配
整个字符串,而是要一个个字符进行匹配,所以简单的暴力方法是行不通的,只能通过字典树的方式来求解,那么其
实发现这一点后就很好写了,只是要判断一下结尾点,因为如果存有“and”,如果查找的是“an”,那么简单的查找的
结果是True,而其实是false,注意了这一点,其实就没问题了。
代码
class WordDictionary {
class treeNode{//定义的树节点
char val;//该节点代表的字符
boolean end = false;//判断这个节点是不是已存入的某一个字符串的结尾
List child = new ArrayList<>();//孩子节点
}
treeNode root;
public WordDictionary() {
root = new treeNode();
}
public void addWord(String word) {
addInTree(root,0,word);
}
private void addInTree(treeNode root,int i,String word){//把字符串加入到里面去
if(i == word.length()){//如果已经加完了,就在最后一个节点打上end标记
root.end=true;
return;
}
char now = word.charAt(i);
//System.out.println(now);
for(Object s:root.child){
treeNode nowNode = (treeNode) s;
if(nowNode.val == now){
addInTree(nowNode,i+1,word);
return;
}
}//寻找当前字符是否存在在孩子节点里,有则继续
treeNode newChildNode = new treeNode();
newChildNode.val = now;
root.child.add(newChildNode);
addInTree(newChildNode,i+1,word);//没有则添加进去
}
public boolean search(String word) {
return findInTree(root,0,word);
}
private boolean findInTree(treeNode root,int i,String word){//进行匹配
if(i == word.length()){//如果字符串匹配完成
return root.end;//如果这个节点不是某字符串的终点就说明不存在
}
char now = word.charAt(i);
boolean ans = false;
for(Object s:root.child){
treeNode nowNode = (treeNode) s;
if(now == '.' || nowNode.val == now){//如果遇到点就要进入所有的子节点进行判定
ans = (ans || findInTree(nowNode,i+1,word));//或不会改变True结果,当然加上if判断如果等于true直接返回退出的话更节省时间
}
}
return ans;
}
}
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/
结语
如果有想一起每天互相监督刷题的小伙伴可以加上微信,咱们一起加油呀!也可以一起讨论讨论题目