Leetcode--Java--676. 实现一个魔法字典
题目描述
样例描述
思路
字典树 前缀树 trie 暴力做法
- 构建字典树,对于每个字符,枚举修改成a~z,除了本身,看新的字符串是否在trie中存在
代码
class MagicDictionary { class TrieNode { TrieNode tns[] = new TrieNode[26]; boolean isWord; public TrieNode(){ } } TrieNode root; public MagicDictionary() { root = new TrieNode(); } public void buildDict(String[] dictionary) { for (String s: dictionary) { TrieNode p = root; for (char c: s.toCharArray()) { int u = c - a; if (p.tns[u] == null) { p.tns[u] = new TrieNode(); } p = p.tns[u]; } p.isWord = true; } } public boolean search(String searchWord) { //先转化为字符数组,方便更改单个字母 char ch[] = searchWord.toCharArray(); for (int i = 0; i < ch.length; i ++ ) { //对于每一个词,枚举它可能替换的词a~z 除了自己本身 for (char c = a; c <= z; c ++ ) { if (ch[i] == c) { continue; } //存下原本的 char orgi = ch[i]; ch[i] = c; //替换 //判断替换后的新字符串在trie树上是否存在 if (helper(new String(ch), root)) { return true; } //记得还原,方便后续判断 ch[i] = orgi; } } return false; } public boolean helper(String s, TrieNode root) { TrieNode p = root; for (char c: s.toCharArray()) { int u = c - a; if (p.tns[u] == null) { return false; } p = p.tns[u]; } return p.isWord; } } /** * Your MagicDictionary object will be instantiated and called as such: * MagicDictionary obj = new MagicDictionary(); * obj.buildDict(dictionary); * boolean param_2 = obj.search(searchWord); */