LeetCode 题解(92): Word Search II

2024-05-28 09:18
文章标签 leetcode ii 题解 word search 92

本文主要是介绍LeetCode 题解(92): Word Search II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

Given a 2D board and a list of words from the dictionary, find all words in the board.

Each word must 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 in a word.

For example,
Given words = ["oath","pea","eat","rain"] and board =

[['o','a','a','n'],['e','t','a','e'],['i','h','k','r'],['i','f','l','v']
]
Return ["eat","oath"].

Note:
You may assume that all inputs are consist of lowercase letters a-z.


题解:

用Word Search I 依次查找words里的每个单词会超时。思路由每次用Word Search I查找word 是否在board里转为, 直接看board上的每个字符,如果该字符存在于由words构建的Trie中,则进行DFS,直到递归到找到某个单词,将该单词加入到result中,同时从Trie中删除该单词。注意Trie需要四个方法:insert, search, searchPre, remove。

C++版:

struct TrieNode {bool leaf;TrieNode* children[26];TrieNode() {leaf = false;for(int i = 0; i < 26; i++) {children[i] = NULL;}}
};class Trie {
public:TrieNode* root;Trie() {root = new TrieNode();}~Trie() {delete root;}void insert(string s) {TrieNode* p = root;for(int i = 0; i < s.length(); i++) {if(p->children[s[i]-'a'] == NULL) {TrieNode* newNode = new TrieNode();p->children[s[i]-'a'] = newNode;}if(i == s.length() - 1)p->children[s[i]-'a']->leaf = true;p = p->children[s[i]-'a'];}}bool search(string s) {if(s.length() == 0)return false;int i = 0;TrieNode* p = root;while(i < s.length()) {if(p->children[s[i]-'a'] == NULL)return false;else {p = p->children[s[i]-'a'];i++;}}if(p->leaf == false)return false;return true;}bool searchPre(string s) {if(s.length() == 0)return false;int i = 0;TrieNode* p = root;while(i < s.length()) {if(p->children[s[i]-'a'] == NULL)return false;else {p = p->children[s[i]-'a'];i++;}}return true;}void remove(string s) {if(s.length() == 0)return;if(search(s) == false)return;int i = 0;TrieNode* p = root;while(i < s.length()) {p = p->children[s[i]-'a'];i++;}p->leaf = false;}
};class Solution {
public:vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {vector<string> results;if(words.size() == 0)return results;Trie tree;for(int i = 0; i < words.size(); i++) {tree.insert(words[i]);}vector<vector<bool>> used(board.size(), vector<bool>(board[0].size(), false));for(int i = 0; i < board.size(); i++) {for(int j = 0; j < board[0].size(); j++) {string s;s.push_back(board[i][j]);if(tree.search(s)) {results.push_back(s);tree.remove(s);}else if(tree.searchPre(s)){used[i][j] = true;exist(board, tree, i+1, j, used, s, results);exist(board, tree, i-1, j, used, s, results);exist(board, tree, i, j+1, used, s, results);exist(board, tree, i, j-1, used, s, results);used[i][j] = false;}s.pop_back();}}return results;}void exist(vector<vector<char>>& board, Trie &tree, int i, int j, vector<vector<bool>> & used, string &s, vector<string>& results) {if(i >= board.size() || i < 0 || j >= board[0].size() || j < 0)return;if(used[i][j] == true)return;s.push_back(board[i][j]);if(tree.search(s)) {results.push_back(s);tree.remove(s);}if(tree.searchPre(s)) {used[i][j] = true;exist(board, tree, i+1, j, used, s, results);exist(board, tree, i-1, j, used, s, results);exist(board, tree, i, j+1, used, s, results);exist(board, tree, i, j-1, used, s, results);used[i][j] = false;}s.pop_back();}
};


Java 版:

class TrieNode {boolean leaf;TrieNode[] children;TrieNode() {leaf = false;children = new TrieNode[26];}
}class Trie {TrieNode root = new TrieNode();void insert(String s) {if(s.length() == 0)return;TrieNode p = root;int i = 0;while(i < s.length()) {if(p.children[s.charAt(i)-'a'] == null) {TrieNode newNode = new TrieNode();p.children[s.charAt(i)-'a'] = newNode;}p = p.children[s.charAt(i)-'a'];i += 1;}p.leaf = true;}void remove(String s) {if(s.length() == 0)return;if(search(s) == false)return;TrieNode p = root;int i = 0;while(i < s.length()) {p = p.children[s.charAt(i)-'a'];i += 1;}p.leaf = false;}boolean search(String s) {if(s.length() == 0)return false;TrieNode p = root;int i = 0;while(i < s.length()) {if(p.children[s.charAt(i)-'a'] == null)return false;else {p = p.children[s.charAt(i)-'a'];i += 1;}}if(p.leaf == false)return false;return true;}boolean searchPre(String s) {if(s.length() == 0)return false;TrieNode p = root;int i = 0;while(i < s.length()) {if(p.children[s.charAt(i)-'a'] == null)return false;else {p = p.children[s.charAt(i)-'a'];i += 1;}}return true;}
}public class Solution {public List<String> findWords(char[][] board, String[] words) {List<String> result = new ArrayList<>();if(board.length == 0 || words.length == 0)return result;boolean[][] used = new boolean[board.length][board[0].length];Trie tree = new Trie();for(String word : words) {tree.insert(word);}for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {String s = Character.toString(board[i][j]);if(tree.search(s) == true) {result.add(s);tree.remove(s);}if(tree.searchPre(s) == true) {used[i][j] = true;exist(board, words, used, tree, result, s, i+1, j);exist(board, words, used, tree, result, s, i-1, j);exist(board, words, used, tree, result, s, i, j+1);exist(board, words, used, tree, result, s, i, j-1);used[i][j] = false;}}}return result;}void exist(char[][] board, String[] words, boolean[][] used, Trie tree, List<String> result, String s, int i, int j) {if(i < 0 || i >= board.length || j < 0 || j >= board[0].length)return;if(used[i][j] == true)return;s += Character.toString(board[i][j]);if(tree.search(s) == true) {result.add(s);tree.remove(s);}if(tree.searchPre(s) == true) {used[i][j] = true;exist(board, words, used, tree, result, s, i+1, j);exist(board, words, used, tree, result, s, i-1, j);exist(board, words, used, tree, result, s, i, j+1);exist(board, words, used, tree, result, s, i, j-1);used[i][j] = false;}s = s.substring(0, s.length()-1);}
}

Python版:

Python版超时,但在local machine上test超时case结果是正确的。同时在Trie上加上记录单词个数的size变量,进一步优化,在local machine上 只需2~3ms。但还是超时。

class TrieNode:def __init__(self):self.leaf = Falseself.children = [None] * 26class Trie:def __init__(self):self.root = TrieNode()self.size = 0def insert(self, s):if len(s) == 0:returnp = self.rooti = 0while i < len(s):if p.children[ord(s[i])-ord('a')] is None:new_node = TrieNode()p.children[ord(s[i])-ord('a')] = new_nodep = p.children[ord(s[i])-ord('a')]i += 1p.leaf = Trueself.size += 1def remove(self, s):if len(s) == 0:returnif not self.search(s):returnp = self.rooti = 0while i < len(s):p = p.children[ord(s[i])-ord('a')]i += 1p.leaf = Falseself.size -= 1def search(self, s):if len(s) == 0:return Falsep = self.rooti = 0while i < len(s):if p.children[ord(s[i])-ord('a')] is None:return Falseelse:p = p.children[ord(s[i])-ord('a')]i += 1if not p.leaf:return Falsereturn Truedef searchPre(self, s):if len(s) == 0:return Falsep = self.rooti = 0while i < len(s):if p.children[ord(s[i])-ord('a')] is None:return Falseelse:p = p.children[ord(s[i])-ord('a')]i += 1return Trueclass Solution:# @param {character[][]} board# @param {string[]} words# @return {string[]}def findWords(self, board, words):result = []if len(board) == 0 or len(words) == 0:return resultused = [[False] * len(board[0]) for i in range(len(board)) ]tree = Trie()for word in words:tree.insert(word)for i in range(len(board)):for j in range(len(board[0])):if tree.size == 0:return results = board[i][j]if tree.search(s):result.append(s)tree.remove(s)if tree.searchPre(s):used[i][j] = Trueself.exist(board, words, used, tree, result, s, i+1, j)self.exist(board, words, used, tree, result, s, i-1, j)self.exist(board, words, used, tree, result, s, i, j+1)self.exist(board, words, used, tree, result, s, i, j-1)used[i][j] = Falsereturn resultdef exist(self, board, words, used, tree, result, s, i, j):if tree.size == 0:returnif i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):returnif used[i][j]:returns += board[i][j]if tree.search(s):result.append(s)tree.remove(s)if tree.searchPre(s):used[i][j] = Trueself.exist(board, words, used, tree, result, s, i+1, j)self.exist(board, words, used, tree, result, s, i-1, j)self.exist(board, words, used, tree, result, s, i, j+1)self.exist(board, words, used, tree, result, s, i, j-1)used[i][j] = Falses = s[0:len(s)-1]




这篇关于LeetCode 题解(92): Word Search II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010148

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &