board =
[
["A B C E"],
["S F C S"],
["A D E E"]
]
word = "ABCCED", -> return true
word= "SEE" , -> return true
word ="ABCB" , -> return false
2. Implementation
Q1: word search ?
A1: blind search form every character [i][j], search direction up, left, down, right
Q1: no repeated?
A1: when proceed search form certain character, we CANNOT go thru the start character again. MARKED it
Q1: Recursive?
A1: start nowhere and dig in through => DFS =>recursive
Q1: use index?
A1: index is like a trie, we can avoid some not wanted word in early stage
// NOTE: string matching if ( item == word) {
// NOTE: item don't have to backtracking since we get a new String every time we call helper()
// NOTE
if ( index == word.length() ) { return true; }
// NOTE
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || visited[i][j] ||
board[i][j] != word.chatAt(index) )
// NOTE
(H) Word Search II
Word Break II
// NOTE
boolean res = helper(board, i+1,j,word, index+1,visited)
|| helper(board, i-1,j,word, index+1,visited)
|| helper(board, i,j-1,word, index+1, visited)
|| helper(board, i, j+1, word, index+1, visited)
// Backtracking, only visited for search from start node
visited[i][j] = false;
// Time:O(m*n)=O(E+V) whole board, Space:O(m*n) call stack
public boolean exist (char[][] board, String word)
{
// validate the input
if (board == null || board.length ==0 || board[0].length == 0)
return false;
word.trim();
// NOTE: string.length()
if (word == null || word.length() == 0)
return true;
boolean[][] visited = new boolean[board.length][board[0].length];
for ( int i = 0; ; i< board.length;i++ )
{
for ( int j = 0; j < board[0].length; j++ )
{
//if ( helper(board,i,j, word, new string() ) )
if ( helper(board,i,j,word,0, visited) )
return true;
}
}
return false;
}
//private boolean helper(char[][] board, int i, int j, String word, String item)
private boolean helper(char[][] board, int i, int j, String word, int index, boolean[][] visited)
{
//item = item + board[i][j];
// base case to stop
// NOTE: string matching
//if ( item == word)
// NOTE : use index to check word match
if ( index == word.length() )
{
return true;
}
//if (i < 0 || j < 0 || i > board.length || j > board[0].length )
// return false; // out of bound and still no word match
// NOTE: i+1 = len if i = len -1
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || visited[i][j] || board[i][j] != word.chatAt(index) )
return false; // out of bound and still no word match
visited[i][j] = true
// recursive call to recursive
// NOTE: move to top if equal, save the below checking effort
//item = item + board[i][j];
//if (helper(board, i+1, j, word, new String(item))
// || helper(board, i-1, j, word, new string(item))
// || helper(board, i, j+1, word , new String(item))
// || helper(board, i, j-1, word , new String(item))
// )
// return true;
// NOTE: we need to return false, for nested for loop to go on
boolean res = helper(board, i+1,j,word, index+1,visited)
|| helper(board, i-1,j,word, index+1,visited)
|| helper(board, i,j-1,word, index+1, visited)
|| helper(board, i, j+1, word, index+1, visited);
// Backtracking, only visited for search from start node
visited[i][j] = false;
// NOTE: item don't have to backtracking since we get a new String everytime we call helper()
return res;
}
3. Similar ones(H) Word Search II
Word Break II
No comments:
Post a Comment