Leetcode 79. 单词搜索 C++ (深度优先搜索 &&回溯)

题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]

给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.

思路

这道题,可以从矩阵的任意位置开始,向上、向下、向左、向友移动来构造单词。
这里使用深度优先搜索+回溯的思路。
使用一个同等大小的矩阵flag来表示单词是否使用过,因为题目中要求每个单词只能使用一次。

解答

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int row=board.size(),column=board[0].size();
        vector<vector<bool>> flag(row,vector<bool>(column,0));
        for(int i=0;i<row;++i)
        {
            for(int j=0;j<column;++j)
            {
                if(word[0]==board[i][j])
                {
                    flag[i][j]=1;
                    if(dfs(board,word,flag,i,j,0)) return true;
                    flag[i][j]=0;
                }
            }
        }
        return false;
    }
    bool dfs(const vector<vector<char>> &board, const string &word, vector<vector<bool>> flag, int i, int j, int index)
    {
        if(index==word.size()-1) return true;
        //向上搜索
        if(i-1>=0 && board[i-1][j]==word[index+1] && flag[i-1][j]!=true)
        {
            flag[i-1][j]=true;
            if(dfs(board,word,flag,i-1,j,index+1)) return true;
            flag[i-1][j]=false;
        }
        //向下搜索
        if(i+1<board.size() && board[i+1][j]==word[index+1] && flag[i+1][j]!=true)
        {
            flag[i+1][j]=true;
            if(dfs(board,word,flag,i+1,j,index+1)) return true;
            flag[i+1][j]=false;
        }
        //向左搜索
        if(j-1>=0 && board[i][j-1]==word[index+1] && flag[i][j-1]!=true)
        {
            flag[i][j-1]=true;
            if(dfs(board,word,flag,i,j-1,index+1)) return true;
            flag[i][j-1]=false;
        }
        //向右搜索
        if(j+1<board[0].size() && board[i][j+1]==word[index+1] && flag[i][j+1]!=true)
        {
            flag[i][j+1]=true;
            if(dfs(board,word,flag,i,j+1,index+1)) return true;
            flag[i][j+1]=false;
        }
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/yuanliang861/article/details/89485579