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 is those horizontally or V Ertically neighboring. The same letter cell is used more than once.
Example:
Board =[ [' A ', ' B ', ' C ', ' e '], [' s ', ' F ', ' C ', ' s '], [' A ', ' D ', ' e ', ' e ']]given word = ' abcced ', return true. Given Word = "See", return True. Given Word = "ABCB", return false.
At a glance is a DFS problem, but in the process of doing it found that some situation made it into an atypical DFS. The essence of this problem is to find the path, that is, to look for the specified path in the graph--each element as a node in the graph, the upper and lower left and right elements as nodes adjacent nodes. That is, you need to verify in the diagram whether there are lines along a given word path. It is important to note that the traditional DFS only needs to complete the access of all the nodes to know if there is a certain path that meets the requirements, and the problem is to allow repeated access to the "Fork node" in the process of finding the path. The reason is that when Dfs goes to a node, if the node has more than one contiguous node that satisfies the next node requirement for a given path, then if one of the paths does not meet the final total path requirement, we also need to backtrack to the fork node to verify that another fork from this node satisfies the remaining path requirements. Therefore, this is equivalent to adding backtracking in Dfs, that is, we want to record each fork node, and then verify the path after the completion of the verification of the fork node back to the original state, in order to make other fork judgment. Since we want to record the fork node, we can actually set the fork node to a special character, thus eliminating a two-dimensional visited Boolean array, saving some space.
Java
classSolution {Public boolean exist (char[][] board, String word) {if(board = = NULL | | board.length = = 0 | | board[0].length = = 0)returnfalse; if(word.length () = = 0)returntrue; for(int i = 0; i < board.length; i++) { for(int j = 0; J < Board[0].length; J + +) {int P=0; if(Word.charat (0) = =Board[i][j])if(DFS (board, I, J, Word, p))returntrue; } } returnfalse; } Private Boolean DFS (char[][] board, int i, int J, String Word, int p) {if(p = = Word.length ())returntrue; if(I >= board.length | | I < 0 | | J >= Board[0].length | | J < 0 | | board[i][j]! = Word.charat (P))returnfalse; Char temp=Word.charat (P); BOARD[I][J]='*'; Boolean flag= DFS (board, I, j+1, Word, p+1) | | DFS (board, I, j-1, Word, p+1) | | DFS (board, i+1, J, Word, p+1) | | DFS (board, I-1, J, Word, p+1); BOARD[I][J]=temp; returnFlag; }}
(Java) Leetcode 79. Word search--Word Search