LeetCode——Add and Search Word - Data structure design

Description:

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.

题目很好理解:添加单词查找单词。

首先想到的是用线性数据结构,然后逐个匹配查找。可以想象一定是超时的。

 

 1 public class WordDictionary {
 2     
 3     private List<String> arr = new ArrayList<String>();
 4 
 5     // Adds a word into the data structure.
 6     public void addWord(String word) {
 7         arr.add(word);
 8     }
 9 
10     // Returns if the word is in the data structure. A word could
11     // contain the dot character '.' to represent any one letter.
12     public boolean search(String word) {
13         boolean flag = true;
14         for(String str : arr) {
15             if(str.equals(word)) {
16                 flag = true;
17                 break;
18             }
19             else if(arr.contains(".")) {
20                 if(word.length() != str.length()) {
21                     flag = false;
22                     break;
23                 }
24                 
25                 for(int i=0; i<str.length();) {
26                     char ch1 = str.charAt(i);
27                     char ch2 = word.charAt(i);
28                     if(ch1 == '.' || ch2 == '.' || ch1 == ch2) {
29                         i ++;
30                     }
31                     else {
32                         flag = false;
33                         break;
34                     }
35                 }
36                 
37             }
38             else {
39                 flag = false;
40                 break;
41             }
42         }
43         return flag;
44     }
45 }
46 
47 // Your WordDictionary object will be instantiated and called as such:
48 // WordDictionary wordDictionary = new WordDictionary();
49 // wordDictionary.addWord("word");
50 // wordDictionary.search("pattern");

 

要优化明显要使用Trie树来减少无用的比较次数,从而降低时间复杂度。

关于Trie树:http://www.cnblogs.com/wxisme/p/4876197.html

public class WordDictionary {
    
    private TrieNode root;
    
    public WordDictionary() {
        this.root = new TrieNode();
    }
    
    
    
    private class TrieNode {
        private TrieNode[] son;
        private char val;
        private boolean isEnd;
        public TrieNode() {
            this.son = new TrieNode[26];
            this.isEnd = false;
        }
    }
    
    
    
    

    // Adds a word into the data structure.
    public void addWord(String word) {
        
        char[] wordChars = word.toCharArray();
        TrieNode node = this.root;
        
        for(char ch : wordChars) {
            int pos = ch - 'a';
            if(node.son[pos] == null) {
                node.son[pos] = new TrieNode();
                node.son[pos].val = ch;
            }
            node = node.son[pos];
        }
        node.isEnd = true;
    }
    
    
    public boolean patternSearch(String word, TrieNode node) {
        char[] wordChars = word.toCharArray();
        for(int at=0; at<word.length(); at++) {
            char ch = wordChars[at];
            if(ch != '.') {
                int pos = ch - 'a';
                if(node.son[pos] != null) {
                    
                    node = node.son[pos];
                }
                else {
                    return false;
                }
            }
            else {
                int flag = 0;
                for(int i=0; i<26; i++) {
                    if(node.son[i] != null) {
                        boolean b =patternSearch(word.substring(at+1), node.son[i]);
                        if(b) return b;
                        else {
                            flag ++;
                        }
                    }
                    else {
                        flag ++;
                        continue;
                    }
                }
                if(flag == 26) {
                    return false;
                }
            }
        }
        return node.isEnd;
    }

    // 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) {
        
        return patternSearch(word, this.root);
    }

}

 

posted @ 2015-10-13 19:42  Pickle  阅读(464)  评论(0编辑  收藏  举报