LeetCode 79.单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

 

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

 

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

 

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

Related Topics
  • 数组
  • 回溯
  • 矩阵
  • 👍 988
  • 👎 0
  • class Solution {
        public boolean exist(char[][] board, String word) {
            int n = board.length;
            int m = board[0].length;
            char words[] = word.toCharArray();
            for(int i = 0; i < n; i++){
                for(int j = 0; j < m; j++){
                    if(dfs(board,words,i,j,0)) return true;
                }
            }
            return false;
        }
        public boolean dfs(char[][] board, char[] word, int i, int j, int index){
            if(i<0 || i>=board.length || j<0 || j>=board[0].length || board[i][j]!=word[index]){
                return false;
            }
            if(index == word.length-1) return true;
            
            board[i][j] = '\0'; //把字母删掉
            boolean res = dfs(board,word,i+1,j,index+1) 
                || dfs(board,word,i-1,j,index+1)
                || dfs(board,word,i,j+1,index+1) 
                || dfs(board,word,i,j-1,index+1);
            board[i][j] = word[index];
            return res;
        }
    }
    
    posted @ 2021-08-15 21:27  皮使我快乐  阅读(29)  评论(0)    收藏  举报