136 搜索单词(leetcode 79)

一:解题思路

这个题目有没什么技巧而言,就是以一个字母为中心,递归的进行上下左右进行对比。

Time: O(m*n*3^k), Space: O(m*n)

有点奇怪的是,在leetcode上,同样的程序,Java代码可以通过,但是C++的代码不能通过。但是在lintcode上可以完美通过!,说明leetcode这个测试还是有点bug

二:完整代码示例 (C++版和Java版)

C++:

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

        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (exist(board, visited, i, j, 0, word))
                    return true;
        return false;
    }
};

Java:

class Solution 
    {
        private boolean exist(char[][] board,boolean[][] visited,int i,int j,int idx,String word)
        {
             if(idx==word.length()) return true;
             if(i<0 || i>=board.length || j<0 || j>=board[0].length || visited[i][j] || board[i][j]!=word.charAt(idx))
                 return false;
             visited[i][j]=true;
             boolean existed=exist(board,visited,i-1,j,idx+1,word)||
                     exist(board,visited,i+1,j,idx+1,word)||
                     exist(board,visited,i,j-1,idx+1,word)||
                     exist(board,visited,i,j+1,idx+1,word);
             visited[i][j]=false;
             
             return existed;
        }
        
        public boolean exist(char[][] board, String word) 
        {
             if(board==null || board.length==0 || board[0]==null || board[0].length==0) return false;
             int m=board.length;
             int n=board[0].length;
             boolean[][] visited=new boolean[m][n];
             for(int i=0;i<m;i++)
                 for(int j=0;j<n;j++)
                     if(exist(board,visited,i,j,0,word))
                         return true;
             return false;        
        }
    }

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12714484.html