剑指offer系列12. 矩阵中的路径

原题

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,“b”,“c”,“e”],

[“s”,“f”,“c”,“s”],

[“a”,“d”,“e”,“e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例1:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”

输出:true

示例2:

输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”

输出:false

提示:

1 <= board.length <= 200

1 <= board[i].length <= 200

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof

思路

此题第一感觉就是 深度优先遍历

深度优先搜索就要递归的去找所有可能的情况。

剑指offer系列12. 矩阵中的路径_第1张图片

算法流程

  • 结束条件
    • 当递归的层数等于word的长度时,递归结束。
  • 递工作
    • 上下左右四个方向搜索二维vector,判断是否和word中要匹配的字符相等,如果相等,把当前匹配成功的字符设置为*,表示已经访问过了。
  • 归工作
    • 还原当前矩阵。

代码

  • C++代码
class Solution {
private:
  // 本身、上下左右五个方向,
  int mvDistance[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, 1}, {0, -1}};

public:
  bool exist(vector<vector<char>> &board, string word) {
    int rows = board.size(), cols = board[0].size();
    for (int i = 0; i < rows; ++i) {
      for (int j = 0; j < cols; ++j) {
        // 开始搜索
        if (dfs(i, j, board, 0, word)) {
          return true;
        }
      }
    }
    return false;
  }

  bool dfs(int x, int y, vector<vector<char>> &board, int cnt, string &word) {
    // 搜索完毕返回
    if (cnt == word.size()) {
      return true;
    }
    for (int i = 0; i < 5; ++i) {
      int mx = x + mvDistance[i][0], my = y + mvDistance[i][1];
      // 判断当前位置有没有越界和是否被访问过
      if (0 <= mx && mx < board.size() && 0 <= my && my < board[0].size() && board[mx][my] != '*') {
        // 如果当前位置满足条件
        if (word[cnt] == board[mx][my]) {
          // 标记已经搜索
          board[mx][my] = '*';
          // 继续搜索
          if (dfs(mx, my, board, cnt + 1, word)) {
            return true;
          }
          // 递归返回
          board[mx][my] = word[cnt];
        }
      }
    }
    return false;
  }
};
  • python代码
class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        mvDistance = [[0, 0], [-1, 0], [1, 0], [0, 1], [0, -1]]
        def dfs(x, y, board, cnt, word):
            if cnt == len(word):
                return True
            for i in range(5):
                mx, my = x + mvDistance[i][0], y + mvDistance[i][1]
                if 0 <= mx and mx < len(board) and 0 <= my and my < len(board[0]) and board[mx][my] != '*':
                    if word[cnt] == board[mx][my]:
                        board[mx][my] = '*'
                        if dfs(mx, my, board, cnt + 1, word):
                            return True
                        board[mx][my] = word[cnt]
            return False

        for i in range(len(board)):
            for j in range(len(board[0])):
                if dfs(i, j, board, 0, word):
                    return True
        return False

你可能感兴趣的:(#,剑指offer,#,算法,#,C/C++)