• leetcode面试准备:Add and Search Word


    leetcode面试准备:Add and Search Word - Data structure design

    1 题目

    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.

    2 思路

    该题是实现trie树的变种。因此我们首先需要定义节点的数据结构。
    TrieNode节点的属性主要包含以下几点:

    • char content:节点字符内容
    • boolean isEnd:节点是否为一个单词结束的标记
    • LinkedList<TrieNode> childNode: 该节点的所有的孩子节点

    图

    void addWord(String word) Trie一样。
    boolean search(String word) 采用dfs 来进行搜索。

    3 代码

    import java.util.LinkedList;
    
    public class WordDictionary {
    	TrieNode root;
    
    	public WordDictionary() {
    		root = new TrieNode();
    	}
    
    	// Adds a word into the data structure.
    	public void addWord(String word) {
    		if (search(word)) {
    			return;
    		}
    
    		int len = word.length();
    		TrieNode cur = root;
    		for (int i = 0; i < len; i++) {
    			char c = word.charAt(i);
    			TrieNode tmp = cur.subNode(c);
    			if (tmp == null) {
    				tmp = new TrieNode(c);
    				cur.childNode.add(tmp);
    				cur = tmp;
    			} else {
    				cur = tmp;
    			}
    		}
    		cur.isEnd = true;
    	}
    
    	// 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 dfs(root, word, 0);
    	}
    
    	private boolean dfs(TrieNode root, String word, int start) {
    		int len = word.length();
    		if (start == len) {
    			if (root.isEnd)
    				return true;
    			else
    				return false;
    		}
    
    		char c = word.charAt(start);
    		if (c != '.') {
    			TrieNode tmp = root.subNode(c);
    			if (tmp == null)
    				return false;
    			else {
    				return dfs(tmp, word, start + 1);
    			}
    		} else { // '.'
    			for (TrieNode next : root.childNode) {
    				boolean found = dfs(next, word, start + 1);
    				if (found) {
    					return true;
    				}
    			}
    		}
    		return false;
    	}
    
    	static class TrieNode {
    		// Initialize your data structure here.
    		char content; // 节点内容
    		boolean isEnd;// 是否为一个单词的结尾
    		LinkedList<TrieNode> childNode;// 该节点所有的孩子节点
    
    		// Initialize your data structure here.
    		public TrieNode() {
    			this.content = 0;
    			this.isEnd = false;
    			this.childNode = new LinkedList<TrieNode>();
    		}
    
    		public TrieNode(char content) {
    			this.content = content;
    			this.isEnd = false;
    			this.childNode = new LinkedList<TrieNode>();
    		}
    
    		public TrieNode subNode(char c) {
    			for (TrieNode tn : childNode) {
    				if (tn.content == c) {
    					return tn;
    				}
    			}
    			return null;
    		}
    	}
    
    	public static void main(String[] args) {
    		WordDictionary wordDictionary = new WordDictionary();
    		wordDictionary.addWord("bad");
    		wordDictionary.addWord("dad");
    		wordDictionary.addWord("add");
    		boolean res = wordDictionary.search(".ad");
    		System.out.println(res);
    	}
    }
    
    // Your WordDictionary object will be instantiated and called as such:
    
    
    

    4 总结

    很不错的问题,估计面试网易有道,360,百度这样的企业会考到。

  • 相关阅读:
    词频统计
    第二周每周例行报告
    事务管理(ACID)
    Redis
    jar包和war包的区别
    CSS实现Loading加载动画
    如何实现“返回顶部”的页面效果
    PHP页面跳转-常见方法
    局域网络调试方式
    Thinkphp 统计数据库字段总值
  • 原文地址:https://www.cnblogs.com/byrhuangqiang/p/4806664.html
Copyright © 2020-2023  润新知