美文网首页
212. Word Search II

212. Word Search II

作者: 兔普战士 | 来源:发表于2020-03-11 01:52 被阅读0次

    题目概括:

    给一个 board, 一个words, (list[word]), 要求在board里面找出words中的词语,
    例如: board:
    [[o,a,a,n],
    [e,t,a,e],
    [i, h,k,r],
    [i, f,l, v] ]
    words:
    ["oath", "pea", "eat", "rain"]

    专题: Backtracking, Trie

    • 利用Trie 和 backtracking. 时间O(M(4*3^{L-1}),其中M是board中cell的个数,L是words中 word 的最长长度。
    class TrieNode {
       HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
       String word = null;
       public TrieNode() {}
    }
    class Solution {
      char[][] _board = null;
      ArrayList<String> _result = new ArrayList<String>();
     public List<String> findWords(char[][] board, String[] words) 
    {
      //Step 1). Construct the Trie 
      TrieNode root = new TrieNode();
      for (String word: words) {
        TrieNode node = root;
        
        for (Character letter : word.toCharArray()) {
            if (node.children.containsKey(letter)) {
                node = node.children.get(letter);
              }else {
                TrieNode newNode = new TrieNode();
                node.children.put(letter, newNode);
                node = newNode;
              }
          }
          node.word = word; // store words in Trie
      }
        this._board = board;
      //Step 2). Backtracking starting for each cell in the board
      for (int row = 0; row < board.length; ++row) {
          for (int col = 0; col < board[row].length; ++col) {
                if (root.children.containsKey(board[row][col])) {
                    backtracking(row, col, root);
                  }
            }
        }
      return this._result;
    }
    private void backtracking(int row, int col, TrieNode parent) {
      Character letter = this._board[row][col];
      TrieNode currNode = parent.children.get(letter);
       //check if there is any match 
      if (currNode.word != null) { 
              this._result.add(currNode.word);
              currNode.word = null;
            }
    
          //mark the current letter before the EXPLORATION
     this._board[row][col] = '#';
    
        //explore neighbor cells in around-clock directions: up, right, down, left
      int[] rowOffset = {-1, 0, 1, 0};
      int[] colOffset = {0, 1, 0, -1};
      for (int i = 0; i < 4; i++) {
            int newRow = row + rowOffset[i];
            int newCol = col + colOffset[i];
            if (newRow < 0 || newRow >= this._board.length || newCol < 0 || newCol >= this._board[0].length) {
            continue;
        }
        if (currNode.children.containsKey(this._board[newRow][newCol]) {
              backtracking(newRow, newCol, currNode);
            }
        }
    // End of EXPLORATION, restore the original letter in the board
        this._board[row][col] = letter;
        
        //Optimization: incrementally remove the leaf nodes
        if (currNode.children.isEmpty()) {
            parent.children.remove(letter);
          }
      }
    }
    

    相关文章

      网友评论

          本文标题:212. Word Search II

          本文链接:https://www.haomeiwen.com/subject/tbjadhtx.html