79. Word Search

仅供自己学习

思路:

思路比较简单,就是遍历整个矩阵,查找与word第一个字母相同的元素,然后搜寻他的上下左右的元素是否等于word的下一个元素,如果有一个方向有就从这个方向继续上述步骤。否则将会退出这个元素,从矩阵的下一个元素开始判断。实现的方法就是DFS回溯法。

我们当我们找到word相同元素的时候,我们需要标记走过的元素,因为下一个元素的上下左右方向有一个方向是过来的,所以不能再走,通过建立一个二维数组visited。然后两个for循环开始递归函数。
递归函数要做的就是判断该元素的上下左右是否有与word的元素相同的元素,如果有并且这个方向的元素没有被走过就从这个方向继续调用递归,递归返回的值赋值给res,如果res为true就break掉此次递归,说明后面的递归找全了word,这时候要返回true的结果了。然后函数就直接返回true即可。
此时主函数也是 递归函数的值为true就退出两个for循环,并返回res结果;

这里用的direction{{0,1},{0,-1},{1,0},{-1,0}},作为走到上下左右的元素的途径,使用为 newrow=oldrow+direction[0].first,newcol=oldcol+direction[0].second,这样就获得了右边的元素,即oldrow+0,oldcol+1。

代码:

class Solution {
public:
    bool dfs(vector<vector<char>& board,int r,int c,int start,string word,vector<vector<int>> visited){
        if(board[r][c]!=word[start]) return false;  //如果这个位置的元素不为word的元素那么就不走这个方向
        else if(start==word.length()-1) return true;  //这里有个隐藏条件,这个位置的元素等于word[start]的元素,并且为最后一个元素,那么就可以直接返回true了。
        vector<pair<int,int>> dirction{{0,1},{0,-1},{1,0}{-1,0}}; //用于控制方向
        visited[i][j]=true; //改为true避免走遍历过的元素,visited只针对此次寻找
        bool res=true;
        for(auto& dir:dirction){
            int newr=i+dir.first,newc=j+dir.second;
            if(newr>=0&&newr<board.size()&&newc>=0&&newc<board[0].size()){
                if(!visited[newr][newc]){
                    res=dfs(board,newr,newc,,start+1,word,visited);
                    if(res) break;
                }
            }
        }
        visited[i][j]=false; //当这个元素的各个方向查找结束后 就把这个元素恢复,因为下一个元素可能会通过这个元素找到word里的元素。
        return res;

    }
    bool exist(vector<vector<char>>& board, string word) {
        int row=board.size(),col=board[0].size();
        vector<vector<char>> visited(row,vector<int> col);
        for(int i=0;i<row;++i){
            for(int j=0;j<col;++j){
                bool res=dfs(board,i,j,0,word,visited);
                if(res) return true;
            }
        }
        return false;
    }
};

因为这个visited的作用只是为了让走过的元素不会被重复走,那么我们只需要改成其他的元素,最后再改回来就可以,就节省了O(N^2)的空间
代码:

class Solution {
public:
    bool dfs(vector<vector<char>>& board,int r,int c,int start,string word){
        if(board[r][c]!=word[start]) return false;
        else if(start==word.length()-1) return true;
        vector<pair<int,int>> dirction{{0,1},{0,-1},{1,0},{-1,0}};
        board[r][c]='#';
        bool res=false;
        for(auto& dir:dirction){
            int newr=r+dir.first,newc=c+dir.second;
            if(newr>=0&&newr<board.size()&&newc>=0&&newc<board[0].size()){
                if(board[newr][newc]!='#'){
                    res=dfs(board,newr,newc,start+1,word);
                    if(res) break;
                }
            }
        }
        board[r][c]=word[start];
        return res;

    }
    bool exist(vector<vector<char>>& board, string word) {
        int row=board.size(),col=board[0].size();
        for(int i=0;i<row;++i){
            for(int j=0;j<col;++j){
                bool res=dfs(board,i,j,0,word);
                if(res) return true;
            }
        }
        return false;
    }
};
posted @ 2021-04-01 20:00  Mrsdwang  阅读(82)  评论(0编辑  收藏  举报