zoukankan      html  css  js  c++  java
  • Leetcode 79 单词搜索 word-search tag 数组 dfs

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

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

    示例:

    board =
    [
      ['A','B','C','E'],
      ['S','F','C','S'],
      ['A','D','E','E']
    ]
    
    给定 word = "ABCCED", 返回 true.
    给定 word = "SEE", 返回 true.
    给定 word = "ABCB", 返回 false.

    思路:

    首先找到word中第一个字母所在位置,然后dfs,在每次遍历中,查找i,j四个方向中的字母,同时记录已经遍历过的位置,防止重复。直到begin==word.size()。表明已经查找完全。

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

    优化的一点是,可以不创建use,而直接修改board来时间路径记录

    class Solution {
    public:
        bool exist(vector<vector<char>>& board, string word) {
            int m=board.size();
            int n=board[0].size();
            bool res = false;
            
            for(int i=0;i<m;++i)
            {
                for(int j=0;j<n;++j)
                {
                    if(word[0]==board[i][j])
                    {
                        board[i][j]='!';
                        res|=dfs(board,word,i,j,1);
                        board[i][j]=word[0];
                    }
                }
            }
            return res;
        }
        bool dfs(vector<vector<char>>& board, string word, int i, int j, int begin)
        {
            if(begin==word.size())
                return true;
            bool res = false;
            if(i-1>=0&&board[i-1][j]==word[begin]) {
                board[i-1][j]='!';
                res|=dfs(board,word,i-1,j,begin+1);
                board[i-1][j]=word[begin];
            }
            if(i+1<board.size()&&board[i+1][j]==word[begin]) {
                board[i+1][j]='!';
                res|=dfs(board,word,i+1,j,begin+1);
                board[i+1][j]=word[begin];
            }
            if(j-1>=0&&board[i][j-1]==word[begin]){
                board[i][j-1]='!';
                res|=dfs(board,word,i,j-1,begin+1);
                board[i][j-1]=word[begin];
            }
            if(j+1<board[0].size()&&board[i][j+1]==word[begin]){
                board[i][j+1]='!';
                res|=dfs(board,word,i,j+1,begin+1);
                board[i][j+1]=word[begin];
            }
            return res;
        }
    };
    联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
  • 相关阅读:
    (转)基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
    (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作
    (转)基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度
    心得体悟帖---200301(因为别人或者别的事情,影响自己的心情,实在是太傻b了)
    心得体悟帖---200301(尽量把课程弄短,那样不良状态也可以录课)
    范仁义js课程---34、break和continue
    尚硅谷js---44、break和continue
    javascript疑难问题---5、javascript代码执行时间的计算
    范仁义js课程---33、打印99乘法表
    范仁义js课程---32、for循环嵌套
  • 原文地址:https://www.cnblogs.com/zl1991/p/14632369.html
Copyright © 2011-2022 走看看