Link
LCOF12 矩阵中的路径
Description
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
Analyze
DFS + 剪枝
- 搜索下标越界、当前字符不匹配,返回当前搜索结果false
- 匹配完毕,返回true
- 替换矩阵中检索到的当前字符,标记已检索,对下一个字符进行检索,检索方向为下、上、右、左
Code
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
for(int row = 0; row < board.size(); ++row){
for(int col = 0; col < board[0].size(); ++col){
if (dfs(board, word, row, col, 0)) return true;//搜索矩阵所有元素
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string& word, int row, int col, int strIndex){
if(row >= board.size() || row < 0 || col >= board[0].size() ||
col < 0 || board[row][col] != word[strIndex]) return false;//越界或不匹配
if(strIndex + 1 == word.size()) return true;//匹配完毕
char tmp = board[row][col];//标记已检索
board[row][col] = '/';
bool res = dfs(board, word, row+1, col, strIndex+1) ||
dfs(board, word, row-1, col, strIndex+1) ||
dfs(board, word, row, col+1, strIndex+1) ||
dfs(board, word, row, col-1, strIndex+1);//检索当前位置下上右左与下一个字符是否匹配
board[row][col] = tmp;//恢复标记字符
return res;
}
};