Java 求解单词搜索

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解单词搜索相关的知识,希望对你有一定的参考价值。

一、题目

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

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

二、代码

采用回溯的思想,当第一个字符匹配时,开始对其进行递归判断

同时需要一个标志 数组记录当前字符是否被访问过,防止重复访问

每个字符都可以对其上下左右进行操作,为了操作方便,引入控制数组 directions

class Solution 
    //控制左右移动
    private int[][] directions = 1, 0, 0, 1, -1, 0, 0, -1;

    public boolean exist(char[][] board, String word) 
        //控制不重复访问
        boolean[][] flag = new boolean[board.length][board[0].length];
        for (int i = 0; i < board.length; i++) 
            for (int j = 0; j < board[0].length; j++) 
                //只有当第一个字符匹配时,才对其进行递归判断
                if (board[i][j] == word.charAt(0) && dfs(board, word, 0, i, j, flag)) 
                    return true;
                
            
        
        return false;
    

    public boolean dfs(char[][] board, String word, int index, int i, int j, boolean[][] flag) 
        //匹配成功
        if (index == word.length()) 
            return true;
        
        //排除不满足条件的情况
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) 
            return false;
        
        //如果当前位满足匹配,则对其递归继续判断
        if (board[i][j] == word.charAt(index) && !flag[i][j]) 
            flag[i][j] = true;
            //判断四种情况
            for (int[] dir : directions) 
                //只要有一种情况符合即可
                if (dfs(board, word, index + 1, i + dir[0], j + dir[1], flag)) 
                    return true;
                
            
            flag[i][j] = false;
        

        return false;
    

以上是关于Java 求解单词搜索的主要内容,如果未能解决你的问题,请参考以下文章

从搜索文档中查找最小片段的算法?

对字谜求解器实施空白平铺搜索的最佳实践

Java 求解划分字母区间

单词求解器 - 全方位

4 个单词,谷歌返回 16 个 SQL 注入漏洞...

反转字谜求解器以首先显示最长的单词