您的位置:首页 > 其它

Word Search | LeetCode

2014-10-22 11:04 232 查看
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 are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =

[
["ABCE"],
["SFCS"],
["ADEE"]
]

word =
"ABCCED"
, -> returns
true
,
word =
"SEE"
, -> returns
true
,
word =
"ABCB"
, -> returns
false
.

本题用来保存数据的是一个二维数组,又是一个求可行解的问题,很自然的会往深搜方面想。因为深搜最常见的问题就是求可行解的总数,求一个可行解,求所有可行解。我们所要做的就是如何去表示状态,存储一个状态需要哪些必要的数据,这样才能够完整提供如何扩展到下一步状态的所有信息。深搜一般用添加函数参数的方式。接下来就是判重,介于本题是用二维数组来保存数据的,我们可以开一个大布尔数组来表示每一趟递归时各个数据的被访问情况。最后,需要知道终止的条件和收敛的条件,很多情况下,收敛和终止的条件是合在一起。本题的加速我们是使用剪枝的方式,因为另一种加速方式,缓存一般是对于状态转换图是DAG的情况下, 且存在重叠的子问题,具体可以用HashMap。

Java:

public class Solution {
public boolean exist(char[][] board, String word)
{
int rank = board.length;
int row = board[0].length;
boolean visited[][] = new boolean[rank][row];
for (int i = 0; i < rank; i++)
{
for (int j = 0; j < row; j++)
{
if (dfs(board,word,0,i,j,visited))
{
return true;
}
}
}
return false;
}

public boolean dfs(char board[][], String word, int index, int x, int y, boolean visited[][])
{
if (index == word.length())
{
return true;
}
if (x < 0 || y < 0 || y >= board[0].length || x >= board.length)
{
return false;
}

if (visited[x][y])
{
return false;
}

if (board[x][y] != word.charAt(index) )
{
return false;
}

visited[x][y] = true;
boolean result = dfs(board, word, index+1, x+1, y, visited) ||
dfs(board, word, index+1, x, y+1, visited) ||
dfs(board, word, index+1, x-1, y, visited) ||
dfs(board, word, index+1, x, y-1, visited);
visited[x][y] = false;
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: