Leetcode:211.添加与搜索单词-数据结构设计

设计一个支持以下两种操作的数据结构:

void addWord(word)
bool search(word)

search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。

示例:

addWord("bad")
addWord("dad")
addWord("mad")
search("pad") -> false
search("bad") -> true
search(".ad") -> true
search("b..") -> true

说明:

你可以假设所有单词都是由小写字母 a-z 组成的。

解题思路:

字典树,深度优先搜索,正则匹配。不断地往字典树中添加单词,单词末尾所在的结点需特殊标记。查询过程中,如果遇到如果遇到字母,那么当前结点next[ch-'a']处必须不为空,否则查询失败。如果遇到'.'那么只要在next中任意一个找到剩余的字符匹配,则查询成功,否则查询失败。

Leetcode:211.添加与搜索单词-数据结构设计_第1张图片

C++代码

struct TreeNode26 {
    char val;
    TreeNode26* next[26];
    bool isLast = false;
    TreeNode26(char v) {
        val = v;
        for (int i = 1; i <= 26; i++) {
            next[i - 1] = NULL;
        }
    }
    bool hasChild26() {
        for (int i = 1; i <= 26; i++) {
            if (next[i - 1]) return true;
        }
        return false;
    }
};
class WordDictionary {
public:
    /** Initialize your data structure here. */
    TreeNode26 *root;
    WordDictionary() {
        root = new TreeNode26(' ');
    }

    /** Adds a word into the data structure. */
    void addWord(string word) {
        int size = word.size();
        TreeNode26 *node = root;
        for (int i = 1; i <= size; i++) {
            int pos = word[i - 1] - 'a';
            if (node->next[pos] == NULL) { 
                node->next[pos] = new TreeNode26(word[i - 1]); 
            }
            node = node->next[pos];
        }
        node->isLast = true;
    }

    /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
    bool search(string word) {
        data = word;
        return DFS(root, 0);
    }
    bool DFS(TreeNode26 *node ,int pos) {
        char ch = data[pos];
        if (pos == int(data.size())) {
            return node->isLast;
        }
        if (ch == '.') {
            for (int i = 1; i <= 26; i++) {
                if (node->next[i - 1]&&DFS(node->next[i - 1], pos + 1)) return true;
            }
            return false;
        }
        else {
            if (node->next[ch - 'a'])  return DFS(node->next[ch - 'a'], pos + 1);
            return false;
        }
    }
    string data;
};

 

你可能感兴趣的:(Leetcode,C,Leetcode,C,添加与搜索单词-数据结构设计)