• Java for LeetCode 212 Word Search II


    Given a 2D board and a list of words from the dictionary, find all words in the board.

    Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

    For example,
    Given words = ["oath","pea","eat","rain"] and board =

    [
      ['o','a','a','n'],
      ['e','t','a','e'],
      ['i','h','k','r'],
      ['i','f','l','v']
    ]
    

    Return ["eat","oath"].

    解题思路:

    本题承接自Java for LeetCode 079 Word Search 但是用dfs会TLE,真正的做法是将word放进Trie里面,然后遍历trie里的每个点,看是否能匹配到trie里的元素,JAVA实现如下:

    public class Solution {
    	public List<String> findWords(char[][] board, String[] words) {  
    		HashSet<String> list=new HashSet();
    		Trie trie = new Trie();  
            for (String word : words)
                trie.insert(word);   
            boolean[][] visited=new boolean[board.length][board[0].length];
            for (int i = 0; i < board.length; i++) 
                for (int j = 0; j < board[0].length; j++)
                    dfs(list,board, visited, "", i, j, trie);   
            return new ArrayList(list);  
        }  
          
        public void dfs(Set<String> list,char[][] board, boolean[][] visited, String str, int x, int y, Trie trie) {  
            if (x < 0 || x >= board.length || y < 0 || y >= board[0].length)
            	return;  
            if (visited[x][y]) 
            	return;  
            str += board[x][y];  
            if (!trie.startsWith(str)) 
            	return;  
            if (trie.search(str)) 
                list.add(str);
            visited[x][y] = true;  
            dfs(list,board, visited, str, x - 1, y, trie);  
            dfs(list,board, visited, str, x + 1, y, trie);  
            dfs(list,board, visited, str, x, y - 1, trie);  
            dfs(list,board, visited, str, x, y + 1, trie);  
            visited[x][y] = false;  
        }  
    }
    class TrieNode {
    	// Initialize your data structure here.
    	int num;// 有多少单词通过这个节点,即节点字符出现的次数
    	TrieNode[] son;// 所有的儿子节点
    	boolean isEnd;// 是不是最后一个节点
    	char val;// 节点的值
    
    	TrieNode() {
    		this.num = 1;
    		this.son = new TrieNode[26];
    		this.isEnd = false;
    	}
    }
    
    class Trie {
    	protected TrieNode root;
    
    	public Trie() {
    		root = new TrieNode();
    	}
    
    	public void insert(String word) {
    		if (word == null || word.length() == 0)
    			return;
    		TrieNode node = this.root;
    		char[] letters = word.toCharArray();
    		for (int i = 0; i < word.length(); i++) {
    			int pos = letters[i] - 'a';
    			if (node.son[pos] == null) {
    				node.son[pos] = new TrieNode();
    				node.son[pos].val = letters[i];
    			} else {
    				node.son[pos].num++;
    			}
    			node = node.son[pos];
    		}
    		node.isEnd = true;
    	}
    
    	// Returns if the word is in the trie.
    	public boolean search(String word) {
    		if (word == null || word.length() == 0) {
    			return false;
    		}
    		TrieNode node = root;
    		char[] letters = word.toCharArray();
    		for (int i = 0; i < word.length(); i++) {
    			int pos = letters[i] - 'a';
    			if (node.son[pos] != null) {
    				node = node.son[pos];
    			} else {
    				return false;
    			}
    		}
    		return node.isEnd;
    	}
    
    	// Returns if there is any word in the trie
    	// that starts with the given prefix.
    	public boolean startsWith(String prefix) {
    		if (prefix == null || prefix.length() == 0) {
    			return false;
    		}
    		TrieNode node = root;
    		char[] letters = prefix.toCharArray();
    		for (int i = 0; i < prefix.length(); i++) {
    			int pos = letters[i] - 'a';
    			if (node.son[pos] != null) {
    				node = node.son[pos];
    			} else {
    				return false;
    			}
    		}
    		return true;
    	}
    }
    
  • 相关阅读:
    统计学习及监督学习概论(2)
    推荐系统(1)
    统计学习及监督学习概论(1)
    JavaScript学习08 Cookie对象
    JavaScript学习07 内置对象
    JavaScript学习06 JS事件对象
    JavaScript学习05 定时器
    JavaScript学习04 对象
    JavaScript学习03 JS函数
    JavaScript学习02 基础语法
  • 原文地址:https://www.cnblogs.com/tonyluis/p/4564425.html
Copyright © 2020-2023  润新知