lintcode :单词搜索
题目
单词搜索
给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
给出board =
[
"ABCE",
"SFCS",
"ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false.
解题
直接深度搜索
public class Solution {
public boolean exist(char[][] board, String word) {
return method(board,word);
}
public boolean method(char[][] board,String word){
int row = board.length;
int col = board[0].length;
boolean[][] visited = new boolean[row][col];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
if(dfs(board,visited,i,j,0,word))
return true;
return false;
}
public boolean dfs(char[][] board,boolean[][] visited,int row,int col,int index,String word){
if(word.length() == index){
return true;
}
if(row<0 || col<0||row>=board.length || col>=board[0].length) return false;
char ch = word.charAt(index);
if(!visited[row][col] && ch == board[row][col]){
visited[row][col] = true;
boolean res = dfs(board,visited,row-1,col,index+1,word)|| dfs(board,visited,row+1,col,index+1,word)
||dfs(board,visited,row,col-1,index+1,word)|| dfs(board,visited,row,col+1,index+1,word);
visited[row][col] = false;
return res;
}
return false;
}
}
Java Code
修改原始数组,降低空间复杂度
public class Solution {
/**
* @param board: A list of lists of character
* @param word: A string
* @return: A boolean
*/
public boolean exist(char[][] board, String word) {
// write your code here
return method(board,word);
}
public boolean method(char[][] board,String word){
int row = board.length;
int col = board[0].length; for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
if(dfs(board,i,j,0,word))
return true; }
return false;
}
public boolean dfs(char[][] board,int row,int col,int index,String word){
if(word.length() == index){
return true;
}
if(row<0 || col<0||row>=board.length || col>=board[0].length) return false;
char ch = word.charAt(index);
if(board[row][col]!='+' && ch == board[row][col]){
char c = board[row][col];
board[row][col]='+';
boolean res = dfs(board,row-1,col,index+1,word)|| dfs(board,row+1,col,index+1,word)
||dfs(board,row,col-1,index+1,word)|| dfs(board,row,col+1,index+1,word);
board[row][col] = c;
return res;
}
return false;
}
}
Java Code
Python
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
for i in xrange(len(board)):
for j in xrange(len(board[0])):
if self.dfs(board,i,j,word,0):
return True
return False def dfs(self,board,row,col,word,index):
if index == len(word):
return True
if row<0 or col<0 or row>=len(board) or col>=len(board[0]):
return False
ch = word[index]
res = False
if(board[row][col]!='+' and board[row][col] ==ch):
c = board[row][col]
board[row][col] = '+'
res = self.dfs(board,row-1,col,word,index+1) or \
self.dfs(board,row,col-1,word,index+1) or \
self.dfs(board,row+1,col,word,index+1) or \
self.dfs(board,row,col+1,word,index+1)
if res:
return res
else:
board[row][col] = c
return False
lintcode :单词搜索的更多相关文章
- LeetCode第[79]题(Java):Word Search(矩阵单词搜索)
题目:矩阵单词搜索 难度:Medium 题目内容: Given a 2D board and a word, find if the word exists in the grid. The word ...
- 【LeetCode-面试算法经典-Java实现】【079-Word Search(单词搜索)】
[079-Word Search(单词搜索)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a 2D board and a word, find if ...
- Leetcode 212.单词搜索II
单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...
- Leetcode 79.单词搜索
单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- Leetcode之回溯法专题-79. 单词搜索(Word Search)
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
- [LeetCode] 212. 单词搜索 II
题目链接:https://leetcode-cn.com/problems/word-search-ii/ 题目描述: 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在 ...
- Java实现 LeetCode 212 单词搜索 II(二)
212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
随机推荐
- 横屏下的ImagePickerController
Try this way.... As per Apple Document, ImagePicker Controller never Rotate in Landscape mode. You h ...
- 关于使用regsvr32命令注册ActiveX控件失败的解决办法
昨天小编也遇到这样问题,步骤一切都对,没有错误,但是每次在命令行下输入的时候,都会弹出一个对话框: 最后我发现是存放ActiveX控件的路径中带有中文文件名字所导致,所以导致的错误,我们将所在路径下的 ...
- cocos2dx中使用声音引擎需要包含的头文件
1.需要包含的头文件和命名空间 #include "SimpleAudioEngine.h"using namespace CocosDenshion;
- 团队小组开发nabc分析
我们团队开发的项目为:牛逼的手电筒 NABC模型: 1.N:现在每个人几乎走哪,干什么都会拿着手机,而现在年轻人晚上在外面的也不少,所以手机里安装一个手电筒的APP还是很有必要的. 2.A:这学期正在 ...
- javascript各种模式解析
1.工厂模式: 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创建 ...
- npm ERR!无法安装任何包的解决办法
npm ERR! Windows_NT 6.1.7601npm ERR! argv "E:\\node\\\\node.exe" "E:\\node\\node_modu ...
- Netsharp快速入门(之1) 介绍及需求说明
作者:秋时 杨昶 时间:2014-02-15 转载须说明出处 第一章 快速入门介绍 Netsharp是一个企业基础业务管理平台,介绍Netsharp分三个系列,分别是: 1. N ...
- 看我是一只IT小小鸟有感
当我看了<我是一只IT小小鸟>后,有许多的感想.就像许多作者一样,在接触计算机这个专业时都有许多的抱怨,对这个专业的不了解,对这个专业不知道从何学起有深深的无助感,对这个专业在未来的发展有 ...
- bzoj 2697 贪心
就贪心就行了,首先可以看成n个格子,放物品,那么 一个物品假设放3个,放在1,k,n处,那么价值和放在1,n 是一样的,所以一个物品只放两个就行了,价值大的应该尽量放 在两边,那么排序之后模拟就行了 ...
- 【BZOJ】【1087】【SCOI2005】互不侵犯King
状压DP 我写的太水了……64ms才过,估计还有更好的做法,希望各位神犇不吝赐教>_<. 嗯这题很明显每一行都可以用一个2进制数表示放置方式的,(1表示放,0表示不放).然后预处理一下所有 ...