leetcode 79 剑指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

解题思路:
1.先在给定的矩阵中寻找word中的第一个字符,找到了则接着找,找不到了则return false;
2.如何寻找下一个单词,需要分几种情况讨论,依次寻找当前字符的上、下、左、右,匹配word的下一个字符。(这一步需要用“或”给定条件)。每匹配到一个字符,为了保证不重复寻找之前的字符,可以将之前的字符置为‘/’。依次向下递归查找,直到word全部查完。
3.查完后,回溯,将之前置为‘/’的字符更新,如果找出了word则可以直接返回true,如果没找到,则换一个首字符继续查找。

代码实现:

bool DFS(char** board, int row, int col, char* word, int x, int y){
     
    if (* word == '\0'){
                 //如果搜索到了word的结束字符,则搜索完毕
        return true;
    }
    if (x < 0 || x >= row || y < 0 || y >= col || board[x][y] != * word){
     
        return false;       //如果行、列越界,或者没有搜索到word中的字符,则未找到word
    }
    board[x][y] = '/';      //如果在board中找到了相应的字符,为避免重复查找,将该字符变成'\'
    bool res = DFS(board, row, col, word + 1, x + 1, y) ||
               DFS(board, row, col, word + 1, x - 1, y) ||
               DFS(board, row, col, word + 1, x, y + 1) ||
               DFS(board, row, col, word + 1, x, y - 1);    //向上下左右递归
    board[x][y] = * word;       //将置为'/'的board更新一遍,可能从主函数这一位开始找是找不到的
    return res;
}

bool exist(char** board, int boardSize, int* boardColSize, char* word){
     
    for (int x = 0; x < boardSize; x++){
     
        for (int y = 0; y < boardColSize[0]; y++){
           //寻找word的第一个字符
            if (board[x][y] == word[0] && DFS(board, boardSize, boardColSize[0], word, x, y)){
     
                return true;        //如果存在word第一个字符以它为起始进行深度优先搜索
            }
        }
    }
    return false;
}

总结:
这种类型的题看上去十分麻烦,但是只要仔细的按逻辑分析,就不难,算法,终究还是需要先想算法,然后再用代码实现,一步一步的来,先找第一个数,然后再找第二个数。
另一个就是递归,递归经常会把我绕进去,递归之后如果还有步骤的话,一定是先将递归执行完了,再去执行下一步程序。

你可能感兴趣的:(LeetCode,算法,leetcode,dfs,C语言)