leetcode-212-单词搜索②
题目描述:


第一次提交:(超出时间限制)
class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
def dfs(word,i,j,visited):
if len(word)==1 and word==board[i][j]:
return True
elif word[0]!=board[i][j]:return
else:
list = [[i-1,j],[i+1,j],[i,j-1],[i,j+1]]
for i,j in list:
if 0<=i<len(board) and 0<=j<len(board[0]) and (i,j) not in visited:
if dfs(word[1:],i,j, visited|{(i, j)}):
return True
res = []
for word in words:
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(word,i,j,{(i, j)}):
res.append(word)
return list(set(res))
方法二:前缀树
class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
trie = {} # 构造字典树
for word in words:
node = trie
for char in word:
node = node.setdefault(char, {})
node['#'] = True def search(i, j, node, pre, visited): # (i,j)当前坐标,node当前trie树结点,pre前面的字符串,visited已访问坐标
if '#' in node: # 已有字典树结束
res.add(pre) # 添加答案
for (di, dj) in ((-1, 0), (1, 0), (0, -1), (0, 1)):
_i, _j = i+di, j+dj
if -1 < _i < h and -1 < _j < w and board[_i][_j] in node and (_i, _j) not in visited: # 可继续搜索
search(_i, _j, node[board[_i][_j]], pre+board[_i][_j], visited | {(_i, _j)}) # dfs搜索 res, h, w = set(), len(board), len(board[0])
for i in range(h):
for j in range(w):
if board[i][j] in trie: # 可继续搜索
search(i, j, trie[board[i][j]], board[i][j], {(i, j)}) # dfs搜索
return list(res)
leetcode-212-单词搜索②的更多相关文章
- [leetcode] 212. 单词搜索 II(Java)
212. 单词搜索 II 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 ...
- [LeetCode] 212. 单词搜索 II
题目链接:https://leetcode-cn.com/problems/word-search-ii/ 题目描述: 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在 ...
- Java实现 LeetCode 212 单词搜索 II(二)
212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...
- Leetcode 212.单词搜索II
单词搜索II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...
- Java实现 LeetCode 212 单词搜索 II
public class Find2 { public int[] dx={1,-1,0,0}; public int[] dy={0,0,1,-1}; class Trie{ Trie[] trie ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
- Leetcode 79.单词搜索
单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- LeetCode 79.单词搜索 - JavaScript
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...
- LeetCode——79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
随机推荐
- VScode Python no module的解决方法
在lauch.json中,修改 "env": {}为 "env": {"PYTHONPATH":"${workspaceRoot} ...
- CSS标准的书写顺序
- Hadoop–TaskTracker 相关
TaskTracker 是Hadoop集群中运行于各个节点上的服务.他是JobTracker和Task之间的"通信桥梁".一方面它从JobTracker端接受并执行各种命令:比如运 ...
- 26.String类(1)
1. 下面是一个使用equals的例子: 我查看了一下源代码,string类中equals方法的源代码如下: public boolean equals(Object anObject) { if ( ...
- leetcood学习笔记-108-将有序数组转换为二叉搜索树
---恢复内容开始--- 题目描述: 方法一: class Solution(object): def sortedArrayToBST(self, nums): """ ...
- leetcood学习笔记-167-两数之和 II - 输入有序数组
题目描述: 第一次提交: class Solution(object): def twoSum(self, numbers, target): """ :type num ...
- Java——子类对象实例化的全过程
2.4子类对象实例化的全过程 public class TestDog { public static void main(String[] args) { Dog d = new Dog(); d. ...
- idea中添加mysql驱动jia包的方法
1 将相关jar包拷贝到自己所建的lib 文件夹下 如下图所示 2 选中自己的module 接着选择Project Structure 如下图 3 接着如下图继续操作 如上图完成后 那么我们 ...
- BZOJ 3669: [Noi2014]魔法森林(lct+最小生成树)
传送门 解题思路 \(lct\)维护最小生成树.我们首先按照\(a\)排序,然后每次加入一条边,在图中维护一棵最小生成树.用并查集判断一下\(1\)与\(n\)是否联通,如果联通的话就尝试更新答案. ...
- python爬虫教程之美丽汤(一)
python 爬虫之美丽汤 BeautifulSoup 作者: jwang106 1. 使用requests获取网页的html源码 import requests from bs4 import Be ...