首页 > 代码库 > LintCode-Word Search II

LintCode-Word Search II

Given a matrix of lower alphabets and a dictionary. Find all words in the dictionary that can be found in the matrix. A word can start from any position in the matrix and go left/right/up/down to the adjacent position. 

 

Example

Given matrix:

doaf
agai
dcan

and dictionary:

{"dog", "dad", "dgdg", "can", "again"}
 
return {"dog", "dad", "can", "again"}
 
Analysis:
DFS. For every word in the list, check every position of board, if the char at some position matches the first char in the word, then start a DFS at this position.
 
Solution:
 1 public class Solution { 2     /** 3      * @param board: A list of lists of character 4      * @param words: A list of string 5      * @return: A list of string 6      */ 7     public ArrayList<String> wordSearchII(char[][] board, ArrayList<String> words) { 8         ArrayList<String> res = new ArrayList<String>(); 9         if (board.length==0) return res;10         int rowNum = board.length;11         if (board[0].length==0) return res;12         int colNum = board[0].length;13 14         for (int i=0;i<words.size();i++){15             String word = words.get(i);16             if (word.length()==0) continue;17             for (int j=0;j<rowNum;j++){18                 boolean valid = false;19                 for (int k=0;k<colNum;k++)20                     if (board[j][k]==word.charAt(0)){21                         boolean[][] visited = new boolean[rowNum][colNum];22                         for (int p = 0;p<rowNum;p++)23                             Arrays.fill(visited[p],false);24                         valid = isValidWord(board,visited,word,0,j,k);25                         if (valid){26                             res.add(word);27                             break;28                         }29                     }30                 if (valid) break;31             }32         }33 34         return res;35     }36     37     public boolean isValidWord(char[][] board, boolean[][] visited, String word, int pos, int x, int y){38         if (x<0 || x>=board.length || y<0 || y>=board[0].length) return false;        39         if (word.charAt(pos)!=board[x][y] || visited[x][y]) return false;40 41         if (pos==word.length()-1)42                 return true;43         44 45         visited[x][y] = true;46         if (isValidWord(board,visited,word,pos+1,x+1,y) || isValidWord(board,visited,word,pos+1,x-1,y) || isValidWord(board,visited,word,pos+1,x,y+1) || isValidWord(board,visited,word,pos+1,x,y-1))47             return true;48         else {49             visited[x][y]=false;50             return false;51         }52     }53 }

 

LintCode-Word Search II