LeetCode - 79. Word Search
2016-07-17 16:19
393 查看
这道题目的总体思路算是比较清晰,使用双重循环迭代给出的matrix的每一个元素,在遇到每个元素的时候检测从当前这个元素向四个方向出发的单词是不是存在。根据上面的思路我们将检测从当前这个元素出发四个方向的单词是不是存在这一过程写成另外一个函数,并且让它在第一步的函数中被调用。
在matrix中从某个元素开始,寻找单词是否存在的路径的时候,我们需要将已经访问过的元素标记为不能访问,这里可以使用另外一个与matrix一样大小的boolean matrix,但是用这种方法的话消耗的空间太多,这里我们使用了另外一个更加有技巧性的方法,就是Bit Mask。256的二进制表示是11111111,所以将当前元素 XOR 256会得到将当前的元素遮盖起来(即得到一个非字母字符的表示),注意在搜索过后,需要将被遮盖的元素重新恢复过来,从而不影响下一次的重新搜索,这时候只要再进行一次 XOR
256即可。
另外这道题目也使用了DFS的方法,代码如下:
public class Solution {
public boolean exist(char[][] board, String word) {
if(board == null || board.length == 0 || board[0].length == 0) return false;
char[] chars = word.toCharArray();
for(int x = 0; x < board.length; x++){
for(int y = 0; y < board[x].length; y++){
if(dfs(board, x, y, chars, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][]board, int x, int y, char[] chars, int i){
if(i == chars.length) return true;
if(x < 0 || y < 0 || x == board.length || y == board[x].length) return false;
if(board[x][y] != chars[i]) return false;
board[x][y] ^= 256;
boolean exist = dfs(board, x + 1, y, chars, i + 1) ||
dfs(board, x, y + 1, chars, i + 1) ||
dfs(board, x - 1, y, chars, i + 1) ||
dfs(board, x, y - 1, chars, i + 1);
board[x][y] ^= 256;
return exist;
}
}
知识点:
1. Bit Mask的使用 XOR 256 XOR 256
2. DFS的使用还是非常不成熟,还要多看看与这道题目类似的题目多多体会一下
在matrix中从某个元素开始,寻找单词是否存在的路径的时候,我们需要将已经访问过的元素标记为不能访问,这里可以使用另外一个与matrix一样大小的boolean matrix,但是用这种方法的话消耗的空间太多,这里我们使用了另外一个更加有技巧性的方法,就是Bit Mask。256的二进制表示是11111111,所以将当前元素 XOR 256会得到将当前的元素遮盖起来(即得到一个非字母字符的表示),注意在搜索过后,需要将被遮盖的元素重新恢复过来,从而不影响下一次的重新搜索,这时候只要再进行一次 XOR
256即可。
另外这道题目也使用了DFS的方法,代码如下:
public class Solution {
public boolean exist(char[][] board, String word) {
if(board == null || board.length == 0 || board[0].length == 0) return false;
char[] chars = word.toCharArray();
for(int x = 0; x < board.length; x++){
for(int y = 0; y < board[x].length; y++){
if(dfs(board, x, y, chars, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][]board, int x, int y, char[] chars, int i){
if(i == chars.length) return true;
if(x < 0 || y < 0 || x == board.length || y == board[x].length) return false;
if(board[x][y] != chars[i]) return false;
board[x][y] ^= 256;
boolean exist = dfs(board, x + 1, y, chars, i + 1) ||
dfs(board, x, y + 1, chars, i + 1) ||
dfs(board, x - 1, y, chars, i + 1) ||
dfs(board, x, y - 1, chars, i + 1);
board[x][y] ^= 256;
return exist;
}
}
知识点:
1. Bit Mask的使用 XOR 256 XOR 256
2. DFS的使用还是非常不成熟,还要多看看与这道题目类似的题目多多体会一下
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- Redis02 使用Redis数据库(String类型)全面解析
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- 详解C++中实现继承string类的MyString类的步骤
- C#使用Matrix执行缩放的方法
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法