zoukankan      html  css  js  c++  java
  • 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.

    Example:

    Input: 
    board = [
      ['o','a','a','n'],
      ['e','t','a','e'],
      ['i','h','k','r'],
      ['i','f','l','v']
    ]
    words = ["oath","pea","eat","rain"]
    
    Output: ["eat","oath"]

    class Solution {
        public List<String> findWords(char[][] board, String[] words) {
            List<String> list = new ArrayList();
            for(String word: words){
                if(exist(board, word)) list.add(word);
            }
            return list;
        }
        public boolean exist(char[][] board, String word) {
            int m = board.length;
            int n = board[0].length;
            boolean[][] visited = new boolean[m][n];
            for(int i = 0; i < m; i++){//Need traverse all possible i and j until get result
                for(int j = 0; j < n; j++){
                    if(dfs(board,word,0,i,j,visited)) return true;
                }
            }
            return false;
        }
        public boolean dfs(char[][] board, String word, int index, int x, int y,boolean[][] visited){
            if(index==word.length()) return true;   //Means get what needed
            
            if(x<0||x==board.length||y<0||y==board[0].length) return false; //Means go beyond the boundary
             if(visited[x][y]) return false;    //Single element can only be accessed once in a dfs
            if(board[x][y] != word.charAt(index)) return false;
            visited[x][y]= true;    //Means current element never been accessed and existed in word.
                if(dfs(board, word, index+1, x+1,y,visited)||//right
                   dfs(board, word, index+1, x-1,y,visited)||//left
                   dfs(board, word, index+1, x,y+1,visited)||//up
                   dfs(board, word, index+1, x,y-1,visited)){//down
                    return true;
                }
                   visited[x][y] = false;   //Release element xy to be accessed by next dfs
                   return false;
        }
    }

    把wordsearch 1变成函数然后调用

    class Solution {
        public List<String> findWords(char[][] board, String[] words) {
            List<String> res = new ArrayList<>();
            TrieNode root = buildTrie(words);
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    dfs (board, i, j, root, res);
                }
            }
            return res;
        }
    
        public void dfs(char[][] board, int i, int j, TrieNode p, List<String> res) {
            char c = board[i][j];
            if (c == '#' || p.next[c - 'a'] == null) return;
            p = p.next[c - 'a'];
            if (p.word != null) {   // found one
                res.add(p.word);
                p.word = null;     // de-duplicate word in words
            }
    
            board[i][j] = '#';//visited
            if (i > 0) dfs(board, i - 1, j ,p, res); 
            if (j > 0) dfs(board, i, j - 1, p, res);
            if (i < board.length - 1) dfs(board, i + 1, j, p, res); 
            if (j < board[0].length - 1) dfs(board, i, j + 1, p, res); 
            board[i][j] = c;//release board[i][j] after search failure
        }
    
        public TrieNode buildTrie(String[] words) {
            TrieNode root = new TrieNode();
            for (String w : words) {
                TrieNode p = root;
                for (char c : w.toCharArray()) {
                    int i = c - 'a';
                    if (p.next[i] == null) p.next[i] = new TrieNode();
                    p = p.next[i];
               }
               p.word = w;
            }
            return root;
        }
    
        class TrieNode {
            TrieNode[] next = new TrieNode[26];
            String word;
        }
    }

    还可以用trie把words存成trie的形式,然后dfs,减少执行次数和时间

  • 相关阅读:
    ASP.NET面试题(二)
    iBatis.Net系列(四) iBatisNet API基础
    ibatisnet系列(一) 总览
    iBatisnet系列(二) 配置运行环境和日志处理
    HDU 1575 Tr A (矩阵乘法)
    HDU 连连看
    1504: ZZ的橱柜 (优先队列)
    离散化思想
    POJ 2777 Count Color (线段树)
    POJ 1823 Hotel (线段树)
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11909935.html
Copyright © 2011-2022 走看看