一:解题思路
这个题目有没什么技巧而言,就是以一个字母为中心,递归的进行上下左右进行对比。
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; } }