LeetCode79 单词搜索

题目

给定一个 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 
 board 和 word 仅由大小写英文字母组成 

方法

剪枝法

  • 时间复杂度:一个非常宽松的上界为 O(MN⋅3^L),其中 M, N 为网格的长度与宽度,LL 为字符串word 的长度。每个方向只有一次,只能走3次
  • 空间复杂度:O(MN)。我们额外开辟了 O(MN) 的 visited 数组,同时栈的深度最大为O(min(L,MN))。
class Solution {
    public boolean exist(char[][] board, String word) {
        if(board==null||board.length<1) return false;
        int row = board.length,col = board[0].length;
        boolean[][] visited = new boolean[row][col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                boolean res = dfs(board,i,j,word,0,visited);
                if(res) return true;
            }
        }
        return false;
    }
    private boolean dfs(char[][] board,int i,int j,String word,int index,boolean[][] visited){
        if(board[i][j]!=word.charAt(index)) {
            return false;
        }
        if(index==word.length()-1){
            return true;
        }
        visited[i][j] = true;
        int[][] dict = {{1,0},{-1,0},{0,1},{0,-1}};
        boolean result = false;
        for(int[] d:dict){
            int new_i = i+d[0],new_j = j+d[1];
            if((new_i>=0&&new_i<board.length&&new_j>=0&&new_j<board[0].length)&&!visited[new_i][new_j]){
                boolean res = dfs(board,new_i,new_j,word,index+1,visited);
                if(res){
                    result = true;
                    break;
                }
            }
        }
        visited[i][j] = false;
        return result;
    }
}
posted @   你也要来一颗长颈鹿吗  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示