[Leetcode 79] Word Search


题目描述:

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =

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

word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.


解题思路:题意要求我们在board这个矩形中是否能够找到指定的word,如果找到,则返回true,没有找到返回false.这道题目是非常经典的回溯类型的题目,它的思路是这样的:
枚举board中的一条路径,并且在枚举的过程中一边检查是否能够匹配上word,如果顺利的匹配完了所有word的字符,就说明找到了;如果枚举结束之后仍然没有找到,就说明不存在。我用一个全局变量res,来保存最后的结果,最坏的复杂度是0(M4^{n} ),其中M是矩形的个数,因为每一个点,我都当做入口进入搜索了~而每一个结点都可以延伸出4个子节点出来,所以是4^{n} .这个复杂度是很高的,一定要注意能剪枝的地方要剪枝,如搜索到了结果,就直接跳出来,不再进行搜索了.

C++代码如下:

作者:忆臻
链接:https://zhuanlan.zhihu.com/p/24972782
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    bool res = false;                                   
    int direction[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};        //上下左右4个方向
    void serach_board(int i,int j,int level,string word,vector<vector<char>>& board,vector<vector<int>>& visited)
    {
        if(res)                      //已经找到了,就不用再搜索了
            return;
        if(level==word.length())
            res = true;
        if(i<0||i>=board.size()||j<0||j>=board[0].size())  //判断边界条件
            return;
            //return true;             //能到最后就说明全部匹配成功了
        if(visited[i][j])              //这些都相当于剪枝了,但是最坏的情况还是很坏
            return;
        visited[i][j]=1;               //进来才处理这个东西
        if(board[i][j]==word[level])   //如果满足它,就可以继续搜索下去
        {
            for(int k = 0;k<4;k++)
            {
                int new_i = i+direction[k][0];
                int new_j = j+direction[k][1];
                serach_board(new_i,new_j,level+1,word,board,visited); 
            }
        }
        visited[i][j]=0;                       //一定要保证的是使他变回来          
    }
    bool exist(vector<vector<char>>& board, string word) {
        // 此题用搜索
        //二维矩阵的每个点都可以作为搜索的开始
        int row = board.size(),col = board[0].size();
        int i,j;
        vector<vector <int> > visited(row ,vector<int>(col,0));
       //visited是用来一次的搜索不会对同一个字母同时访问俩次
        for(i = 0;i<row;i++)
        {
            for(j = 0;j<col;j++)
            {
                serach_board(i,j,0,word,board,visited);
                if(res == 1)    //如果已经找到的话,那么就return true
                    return true;
            }
        }
        return false;            //如果前面都么有返回true,那么就返回false
    };
};

知乎主页:忆臻
专栏地址:机器学习算法
博客地址:忆臻博客




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值