题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
- 输入的路径不为空;
- 所有出现的字符均为大写英文字母;
样例
matrix=
[
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]
]
str="BCCE" , return "true"
str="ASAE" , return "false"
问题分析
此题还是标准DFS的题。定义一个二维数组point表示某个字符是否被访问过,字符串out表示当前已经匹配的部分,row和col表示当前匹配的最后一个字符的位置坐标。然后先进行整个matrix数组的遍历找到第一个匹配的字符,然后从此字符开始DFS。在DFS函数中依次访问相邻位置的字符,如果某一个相邻的字符匹配则调用DFS函数,如果DFS函数返回true,说明从下一个字符开始都能匹配到,所以当前函数也返回true,否则将point数组和out字符串的状态恢复,准备访问下一个相邻的字符。如果所有相邻的字符都不能顺利匹配下去,那么返回false,表明从当前字符开始的话,到最后是不能匹配的。递归基是out与str等长时,说明已经完全匹配,返回true。在进行整个matrix数组的遍历找到某一个匹配的字符,然后如果此字符的DFS函数返回true的话,那么说明从此字符开始可以完全匹配单词,返回true,否则遍历完整个matrix数组都没有返回true,返回false。
代码实现
class Solution {
public:
bool hasPath(vector<vector<char>>& matrix, string str) {
if(matrix.empty())
return false;
int m = matrix.size();
int n = matrix[0].size();
vector<vector<bool>> point(m, vector<bool>(n, false));
string out;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(matrix[i][j] == str[0]){
point[i][j] = true;
out = out + matrix[i][j];
if(DFS(out, i, j, matrix, point, str))
return true;
point[i][j] = false;
out = out.substr(0, out.size() - 1);
}
return false;
}
bool DFS(string& out, int row, int col, vector<vector<char>>& matrix, vector<vector<bool>>& point, string& str){
if(out.size() == str.size())
return true;
if(col > 0 && matrix[row][col-1] == str[out.size()] && point[row][col-1] == false){
point[row][col-1] = true;
out = out + matrix[row][col-1];
if(DFS(out, row, col-1, matrix, point, str))
return true;
point[row][col-1] = false;
out = out.substr(0, out.size() - 1);
}
if(row > 0 && matrix[row-1][col] == str[out.size()] && point[row-1][col] == false){
point[row-1][col] = true;
out = out + matrix[row-1][col];
if(DFS(out, row-1, col, matrix, point, str))
return true;
point[row-1][col] = false;
out = out.substr(0, out.size() - 1);
}
if(col < matrix[0].size()-1 && matrix[row][col+1] == str[out.size()] && point[row][col+1] == false){
point[row][col+1] = true;
out = out + matrix[row][col+1];
if(DFS(out, row, col+1, matrix, point, str))
return true;
point[row][col+1] = false;
out = out.substr(0, out.size() - 1);
}
if(row < matrix.size()-1 && matrix[row+1][col] == str[out.size()] && point[row+1][col] == false){
point[row+1][col] = true;
out = out + matrix[row+1][col];
if(DFS(out, row+1, col, matrix, point, str))
return true;
point[row+1][col] = false;
out = out.substr(0, out.size() - 1);
}
return false;
}
};