Leetcode-211. 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.

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Word:
    def __init__(self, s):
        self.s = s
 
    def __eq__(self, other):
        if isinstance(other, Word):
            if not self.s or not other.s:
                return self.s == other.s
            if len(self.s) != len(other.s):
                return False
            for i in range(len(self.s)):
                if self.s[i] != other.s[i] and self.s[i] != '.' and other.s[i] != '.':
                    return False
            return True
             
    def __str__(self):
        return self.s
         
    def __hash__(self):
        return hash(str(self))
 
class WordDictionary:
 
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.m = {}
         
 
    def addWord(self, word):
        """
        Adds a word into the data structure.
        :type word: str
        :rtype: void
        """
        key = Word(word)
        if key in self.m:
            self.m[key] += 1
        else:
            self.m[key] = 1
 
    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
        """
        key = Word(word)
        if key in self.m:
            return True
         
        for k in self.m:
            if k == key:
                return True
                 
        return False
        

  这个题目的本质是字典树,使用字典树才不会超时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class WordDictionary:
     
    class TrieNode:
        def __init__(self):
            self.isword = False
            self.child = [None for i in range(26)]
 
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.root = WordDictionary.TrieNode()
         
 
    def addWord(self, word):
        """
        Adds a word into the data structure.
        :type word: str
        :rtype: void
        """
        p = self.root
        for c in word:
            i = ord(c) - ord('a')
            if not p.child[i]:
                p.child[i] = WordDictionary.TrieNode()
            p = p.child[i]
        p.isword = True
 
    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
        """
        return self.searchNode(word, self.root, 0)
         
    def searchNode(self, word, node, i):
        if i == len(word):
            return node.isword
        if word[i] == '.':
            for a in node.child:
                if a and self.searchNode(word, a, i+1):
                    return True
            return False
        else:
            index = ord(word[i]) - ord('a')
            return node.child[index] != None and self.searchNode(word, node.child[index], i+1)

  注意python和C语言的不同

 

1
2
3
4
5
6
7
def hello():
    x = None
    return (x and False) == None
     
def hello2():
    x = None
    return (x and False)

  输出

1
2
3
True
 
None

  

posted @   兜兜有糖的博客  阅读(206)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示