ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

298,添加与搜索单词 - 数据结构设计

2021-06-14 23:03:12  阅读:156  来源: 互联网

标签:node search word TrieNode 单词 chs 298 数据结构 children


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

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 组成的。

答案:

 1public class WordDictionary {
2    public class TrieNode {
3        public TrieNode[] children = new TrieNode[26];
4        public String item = "";
5    }
6
7    private TrieNode root = new TrieNode();
8
9    public void addWord(String word) {
10        TrieNode node = root;
11        for (char c : word.toCharArray()) {
12            if (node.children[c - 'a'] == null) {
13                node.children[c - 'a'] = new TrieNode();
14            }
15            node = node.children[c - 'a'];
16        }
17        node.item = word;
18    }
19
20    public boolean search(String word) {
21        return match(word.toCharArray(), 0, root);
22    }
23
24    private boolean match(char[] chs, int k, TrieNode node) {
25        if (k == chs.length)
26            return !node.item.equals("");
27        if (chs[k] != '.') {
28            return node.children[chs[k] - 'a'] != null && match(chs, k + 1, node.children[chs[k] - 'a']);
29        } else {
30            for (int i = 0; i < node.children.length; i++) {
31                if (node.children[i] != null) {
32                    if (match(chs, k + 1, node.children[i])) {
33                        return true;
34                    }
35                }
36            }
37        }
38        return false;
39    }
40}

解析:

代码比较简单,如果对字典树比较熟悉的话,这题很容易理解,TrieNode可以把它当做一个发散的链表,只是在链表的结尾存储单词,其他节点不存储。

标签:node,search,word,TrieNode,单词,chs,298,数据结构,children
来源: https://blog.51cto.com/u_4774266/2902561

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有