79. 单词搜索

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

79. 单词搜索_第1张图片 解题思路:递归+回溯

首先遍历每一个board中的字符,如果该字符合word的第一个字符相等,就从这个位置进行匹配搜索,如果能够找到word,就返回true,board中可能存在多个字符合word中的第一个字符相等的情况,只要任一个位置能够匹配到,就直接返回true

因为同一个单元格内的字符不能重复使用,需要使用一个额外的合

具体匹配搜索递归算法如下:

  1. 定义递归函数:process(char[][] board, String word, int x, int y, int index)
    1. 含义:从board[x][y]开始与word的第index个位置往后继续匹配,如果能够找到匹配的字符,返回true,否则返回false
  2. 递归终止的条件:
    1. 如果 board[x][y] != word.charAt(index):显然不匹配,返回false
    2. 否则,board当前位置的字符和word的第index个字符匹配,如果index==word.length()-1:已经全部匹配了,返回true
  3. 否则board[x][y]与 word.charAt(index)匹配,继续寻找board中下一个位置与word.charAt(index+1)匹配:
    1. 下一个位置有两个(边界情况,只能向两个方向走)或四个可选择的位置,依次遍历所有可能的位置,假设下一个位置为board[nextX][nextY]:
      1. 如果 flag[nextX][nextY]=false并且 board[nextX][nextY] == word.charAt(index+1):
        1. 令flag[nextX][nextY] = true
        2. result = process(board,word,nextX,nextY,index+1)
        3. 如果result=true,直接返回true
        4. 否则,说明从board[nextX][nextY]位置开始搜索没有匹配到,进行回溯,令flag[nextX][nextY] = flase
    2. 所有位置都没有匹配,返回false

AC代码:

class Solution {
    //标记哪些位置已经访问过
    boolean[][] flag;
    //四个方向
    int[][] direct = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    public boolean exist(char[][] board, String word) {
        if (board.length*board[0].length= 0 && nextX < board.length
                    && nextY >= 0 && nextY < board[0].length
                    && !flag[nextX][nextY]
                    && board[nextX][nextY] == word.charAt(index + 1)) {
                flag[nextX][nextY] = true;
                boolean result = process(board, word, nextX, nextY, index + 1);
                if (result) {
                    return true;
                }
                flag[nextX][nextY] = false;
            }
        }
        return false;
    }
}

79. 单词搜索_第2张图片

 

 

 

你可能感兴趣的:(LeetCode_Java版,递归,矩阵,力扣,leetcode,算法,java)