79. 单词搜索

题目描述:

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

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

 

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
 

提示:

board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

 

思想:

深度优先搜索

对于 word = ABCCEE,可以先采用暴力搜索的办法找到目标字符串 word 中的第一个字符 A,找到之后按照深度优先搜索的顺序寻找是否有和 word 匹配的字符串,如果找到直接返回 True;如果没有,继续寻找下一个 A...

参考:

https://leetcode-cn.com/problems/word-search/solution/tu-jie-di-gui-shen-du-you-xian-sou-suo-by-z1m/

 

代码:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size()==0)
            return false;
        for(int i=0;i<board.size();i++)
            for(int j=0;j<board[0].size();j++){
                if(dfs(board,word,i,j,0))
                    return true;
            }
        return false;
    }
    bool dfs(vector<vector<char>>& board, string& word, int i, int j, int length){
        if(i<0||j<0||i>=board.size()||j>=board[0].size()||length>=word.size()||board[i][j]!=word[length])
            return false;
        if(length==word.size()-1&&word[length]==board[i][j])
            return true;
        char tmp = board[i][j];
        board[i][j] = '0';
        bool flag=dfs(board,word,i+1,j,length+1)||dfs(board,word,i,j+1,length+1)||dfs(board,word,i-1,j,length+1)||dfs(board,word,i,j-1,length+1);
        board[i][j] = tmp;
        return flag;
    }
};

 

posted @ 2020-04-16 20:30  thefatcat  阅读(72)  评论(0编辑  收藏  举报