LeetCode211. Add and Search Word - Data structure design
问题描述
Design a data structure that supports the following two operations:
void addWord(word) bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.
For example:
addWord("bad") addWord("dad") addWord("mad") search("pad") -> false search("bad") -> true search(".ad") -> true search("b..") -> true
Note:
You may assume that all words are consist of lowercase letters a-z.
问题分析
这道题应该属于LeetCode208 Implement Trie (Prefix Tree)的变形问题,只是多了搜索的时候多了个.
那么应该如何考虑这个.
呢。
在匹配的过程中,如果发现.
说明该父节点下的所有子节点都需要进行遍历。如果由一个符合,那么就说明匹配成功,可以考虑用递归来实现。
代码如下
Java代码
class WordDictionary {
/** Initialize your data structure here. */
Node root;
public WordDictionary() {
this.root = new Node();
}
/** Adds a word into the data structure. */
public void addWord(String word) {
Node node = root;
char[] words= word.toCharArray();
for (char c :words
) {
int i = c-'a';
if(node.nextNode[i]==null){
node.nextNode[i]=new Node();
}
node= node.nextNode[i];
}
node.isEnd=true;
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
public boolean search(String word) {
Node node= root;
return search(word,node);
}
boolean search(String word,Node node){
for (int i = 0; i <word.length() ; i++) {
if(word.charAt(i)=='.'){
//如果出现点
for (Node child: node.nextNode
) {
if(child!=null){
if(search(word.substring(i+1,word.length()),child)) return true;
}
}
return false;
}else {
int c = word.charAt(i)-'a';
if(node.nextNode[c]==null) return false;
else node = node.nextNode[c];
}
}
return node.isEnd;
}
class Node{
Node [] nextNode = new Node[26];
boolean isEnd = false;
}
}
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/
LeetCode学习笔记持续更新
GitHub地址 https://github.com/yanqinghe/leetcode
CSDN博客地址 http://blog.csdn.net/yanqinghe123/article/category/7176678