单词搜索

weblog 778 0 0

leetcode79题(中等)

原链接:https://leetcode-cn.com/problems/word-search/

问题描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

示例

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

解题思路

算法:深度优先搜索,回溯,递归

1.遍历该网格的所有节点

2.每遍历一个节点,就从该节点开始,遍历与他相邻的上下左右四个节点,如果遍历到第n个节点并满足第n个节点与word[n]的值对应则继续递归遍历该节点的相邻节点。直到word的所有值都相同返回true。如果不满足第n个节点与word[n]的值对应则回溯上一个节点继续遍历其他相邻。

代码(java)

class Solution {
    public boolean exist(char[][] board, String word) {
        return has(board,word);
    }
    
    public static boolean has(char[][] board, String word) {
        c=word.toCharArray();
        height=board.length;
        width=board[0].length;
        boards=board;
        index=new boolean[height][width];
        for(int i=0;i<board.length;i++){
            for (int j=0;j<board[i].length;j++){
                if(dfs(i,j,0)){
                    return true;
                }
            }
        }
        return false;
    }
    public static char[][] boards;
    public static boolean[][] index;
    public static char[] c;
    public static int width;
    public static int height;
    //方位增量
    public static int[][] local={{0,-1},{-1,0},{0,1},{1,0}};
    public static boolean dfs(int i,int j,int def){
        if(c[def]==boards[i][j]){
            if((def+1)==c.length){
                return true;
            }
            for(int k=0;k<4;k++){
                int i0=i+local[k][0];
                int j1=j+local[k][1];
                if(i0>=0&&i0<height&&j1>=0&&j1<width&&!index[i0][j1]){
                    index[i][j]=true;
                    if(dfs(i0,j1,def+1)){
                        index[i][j]=false;
                        return true;
                    }
                    index[i][j]=false;
                }
            }
        }else{
            return false;
        }
        return false;
    }
}

猜你喜欢
框架 975 lucene全文检依赖jardependencygroupIdorg.apache.lucene/groupIdartifactIdlucene-highlighter
weblog 2680 vue过滤和排序!DOCTYPEhtmlhtml head metacharset="UTF-8" title/title scriptsrc="js/vue.min.js"/script
weblog 5842 a*算法动态演示分析请参考http://photo.jiajiajia.club/item/a-star.html什么是a*算法A*寻算法,俗称A星算法,作为启发式算法中的一种,这是一
weblog 6171 前言了解a*算法的原理请参考:http://www.jiajiajia.club/official/weblog/32a*算法动态演示分析,及代码,请参考:http
数据结构与算法 2553 上一篇:广度优先算法(bfs、广)java实现-数据结构和算法用邻接矩阵表示图的定点之间的关系如下图数据结构则用邻接矩阵表示为: privatestaticintmap
工具 1679 文档,通过分组件进行分,获得元(token)2.通过语言处理组件,2.1进行大写转小写,2.2复数变数,2.3过去式,将来式转换为现在式,获得(Term)3.获取Term3.1获取Term
数据结构与算法 2353 广度优先算法(dfs、深)java实现-数据结构和算法用邻接矩阵表示图的定点之间的关系如下图的数据结构:则用邻接矩阵表示为: privatestaticintmap[][]={ {0,3,6
official 972 述给定一个二叉树的根节点root,和一个整数k,请你设计一个算法查找其中第k个最小元素(从1开始计数)。示例1输入:root=[3,1,4,null,2],k=1 输出:1示例2输入:root=[5
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。