Premiumlab  

https://leetcode.com/problems/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.

 

 

Sol:

 

Use dictionary data structure to solve this problem.

 

The key is the lengh of word, and the word itself is the value. However, if two words have the same length, the keys will clash. To avoid this,  we use defaultdict from collections and we use append method to add new element to the dictionary.  

 

To implement the search method, we check if the input word is in the dictionary. 

 

 

class WordDictionary(object):

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.word_dict = collections.defaultdict(list)
        

    def addWord(self, word):
        """
        Adds a word into the data structure.
        :type word: str
        :rtype: void
        """
        if word:
            self.word_dict[len(word)].append(word)
        

    def search(self, word):
        """
        Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter.
        :type word: str
        :rtype: bool
        """
        
        if not word:
            return False
        if '.' not in word:
            return word in self.word_dict[len(word)]
        
        # if '.' is in the word
        for v in self.word_dict[len(word)]:
            for i, ch in enumerate(word):
                if ch != v[i] and ch != '.':
                    break
            else:
                return True
        return False


# Your WordDictionary object will be instantiated and called as such:
# obj = WordDictionary()
# obj.addWord(word)
# param_2 = obj.search(word)

 

 

 

 

Note:

 

1 for - else usage in python:

 

The else part is executed when for loop does not break. 

 

2 collections.defaultdic usage in python:

import collections
word_dict = collections.defaultdict(list)
word_dict[3].append("pad")
word_dict[3].append("dad")
print "pad" in word_dict[3]
print word_dict[3]

 

 

== >

 

True

['pad', 'dad']

 

3 for i, ch in enumerate(word) usage in python:

 

Since we will check if word is in the dictionary with same key/length, it is natural to use enumerate. 

 

1 seq = ['one', 'two', 'three']
2 for i, element in enumerate(seq):
3     print i, seq[i]

 

 

==>

0 one

1 two

2 three

 

 

Sol 2:

 

Use tree data structure. 

 

https://discuss.leetcode.com/topic/14216/tree-solutions-18-20-lines

 

https://discuss.leetcode.com/topic/26944/python-solution-recursive-version-dfs

 

https://discuss.leetcode.com/topic/23695/python-easy-to-follow-solution-using-trie

 

posted on 2017-07-06 17:21  Premiumlab  阅读(167)  评论(0编辑  收藏  举报