Word Search

Word Search

题目大意

给你一个字符的二维数组,再给你一个一个单词,检测单词是否存在于数组中。这个单词可以由横向或者竖向组成,但是每个字母只能使用一次。

解题思路

使用DFS。遍历数组,一旦首字母相同,便开始DFS。

代码
class Solution {
public:
    int dfs(vector<vector<char> >& board, string word, int row, int col,vector<vector<int> > visit, int num, bool& result)
    {
        visit[row][col] = 1;
        if(num==word.length())
        {
            result = true;
            return 1;
        }
        else
        {
            if(result==false && (row+1)<board.size() &&visit[row+1][col]==0 && board[row+1][col]==word[num])
            {
                visit[row+1][col] == 1;;
                dfs(board, word, row+1, col, visit, num+1, result);
            }
            if(result==false && (col+1)<board[0].size() &&visit[row][col+1]==0 && board[row][col+1]==word[num])
            {
                visit[row][col+1] == 1;
                dfs(board, word, row, col+1, visit, num+1, result);
            }
            if(result==false && (row-1)>=0 &&visit[row-1][col]==0 && board[row-1][col]==word[num])
            {
                visit[row-1][col] == 1;
                dfs(board, word, row-1, col, visit, num+1, result);
            }
            if(result==false && (col-1)>=0 &&visit[row][col-1]==0 && board[row][col-1]==word[num])
            {
                visit[row][col-1] == 1;
                dfs(board, word, row, col-1, visit, num+1, result);
            }
        }
        return 0;
    }
    bool exist(vector<vector<char>>& board, string word) {
        bool result = false;
        char start = word[0];
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(board[i][j]==start && result==false)
                {
                    vector<vector<int> > visit(board.size(), vector<int>(board[0].size(), 0));
                    dfs(board, word, i, j, visit, 1, result);
                }
            }
        }
        return result;
    }
};

优解

解题思路

也是使用DFS,但是代码可以很简练,我的用时117ms,但是DFS可以降到16ms。
主要的时间节省在于,其省略了visit矩阵,非常巧妙的通过赋值为”*”,避开了visit矩阵。

代码
class Solution {
private:
    bool dfs(vector<vector<char>>& board, int row, int col, const string &word, int start, int M, int N, int sLen)
    {
        char curC;
        bool res = false;
        if( (curC = board[row][col]) != word[start]) return false;
        if(start==sLen-1) return true;
        board[row][col] = '*';
        if(row>0) res = dfs(board, row-1, col, word, start+1, M, N, sLen);
        if(!res && row < M-1) res = dfs(board, row+1, col, word, start+1, M, N, sLen);
        if(!res && col > 0)   res = dfs(board, row, col-1, word, start+1, M, N, sLen);
        if(!res && col < N-1) res = dfs(board,  row, col+1, word, start+1, M, N, sLen);
        board[row][col] = curC;
        return res;
    }

public:
    bool exist(vector<vector<char>>& board, string word) {
        int M,N,i,j,sLen = word.size();
        if( (M=board.size()) && (N=board[0].size()) && sLen)
        {
            for(i=0; i<M; ++i)
                for(j=0; j<N; ++j)
                    if(dfs(board, i, j, word, 0, M, N, sLen)) return true;
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值