leetcode 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

代码1

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if (board.empty() || board[0].empty()) return false;
        int m = board.size(), n = board[0].size();
        vector<vector<bool>> isVisit(m,vector<bool>(n,false));
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(dfs(i,j,0,isVisit,board,word))
                    return true;
            }
        }
        return false;
    }
    bool dfs(int i,int j,int cur,vector<vector<bool>> &isVisit,vector<vector<char>> &board,const string& word)
    {
        if(cur == word.size())return true;
        int m = board.size(),n = board[0].size();
        if(i < 0 || j < 0 || i>=m || j>=n||board[i][j] != word[cur] || isVisit[i][j])return false;//注意有等号
        isVisit[i][j] = true;
        bool ans = dfs(i,j-1,cur+1,isVisit,board,word)||
                   dfs(i,j+1,cur+1,isVisit,board,word)||
                   dfs(i-1,j,cur+1,isVisit,board,word)||
                   dfs(i+1,j,cur+1,isVisit,board,word);
        isVisit[i][j] = false;
        return ans;
    }
};

结果

执行用时 :44 ms, 在所有 C++ 提交中击败了56.91%的用户
内存消耗 :8.3 MB, 在所有 C++ 提交中击败了100.00%的用户

代码2

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if (board.empty() || board[0].empty()) return false;
        int m = board.size(), n = board[0].size();
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(dfs(i,j,0,board,word))
                    return true;
            }
        }
        return false;
    }
    bool dfs(int i,int j,int cur,vector<vector<char>> &board,const string& word)
    {
        if(cur == word.size())return true;
        int m = board.size(),n = board[0].size();
        if(i < 0 || j < 0 || i>=m || j>=n||board[i][j] != word[cur] || board[i][j]=='$')return false;//注意有等号
        char c = board[i][j];
        board[i][j] = '$';
        if(dfs(i,j-1,cur+1,board,word))
            return true;//只要有一个成立就好了不用四个条件全部判断
        else if(dfs(i,j+1,cur+1,board,word))
            return true;
        else if(dfs(i-1,j,cur+1,board,word))
            return true;
        else if(dfs(i+1,j,cur+1,board,word))
            return true;
        board[i][j] = c;
        return false;
    }
};

结果

执行用时 :28 ms, 在所有 C++ 提交中击败了78.92%的用户
内存消耗 :7.8 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-06-17 11:59  曲径通霄  阅读(105)  评论(0编辑  收藏  举报