当前位置: 首页 > news >正文

单词搜索 II · Word Search II

https://leetcode.cn/problems/word-search-ii/description/

https://www.jiuzhang.com/solutions/word-search-ii

1.当你需要一个一个遍历字符串,矩阵或者其他的,trie帮助你优化遍历过程中可能性。
2.hash换为trire树节约空间
3.前缀

public class Solution {public static int[] dx = {0, 1, -1, 0};public static int[] dy = {1, 0, 0, -1};/*** @param board: A list of lists of character* @param words: A list of string* @return: A list of string*/public List<String> wordSearchII(char[][] board, List<String> words) {if (board == null || board.length == 0) {return new ArrayList<>();}if (board[0] == null || board[0].length == 0) {return new ArrayList<>();}boolean[][] visited = new boolean[board.length][board[0].length];Map<String, Boolean> prefixIsWord = getPrefixSet(words);Set<String> wordSet = new HashSet<>();for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {visited[i][j] = true;dfs(board, visited, i, j, String.valueOf(board[i][j]), prefixIsWord, wordSet);visited[i][j] = false;}}return new ArrayList<String>(wordSet);}private Map<String, Boolean> getPrefixSet(List<String> words) {Map<String, Boolean> prefixIsWord = new HashMap<>();for (String word : words) {for (int i = 0; i < word.length() - 1; i++) {String prefix = word.substring(0, i + 1);if (!prefixIsWord.containsKey(prefix)) {prefixIsWord.put(prefix, false);}}prefixIsWord.put(word, true);}return prefixIsWord;}private void dfs(char[][] board,boolean[][] visited,int x,int y,String word,Map<String, Boolean> prefixIsWord,Set<String> wordSet) {if (!prefixIsWord.containsKey(word)) {return;}if (prefixIsWord.get(word)) {wordSet.add(word);}for (int i = 0; i < 4; i++) {int adjX = x + dx[i];int adjY = y + dy[i];if (!inside(board, adjX, adjY) || visited[adjX][adjY]) {continue;}visited[adjX][adjY] = true;dfs(board, visited, adjX, adjY, word + board[adjX][adjY], prefixIsWord, wordSet);visited[adjX][adjY] = false;}}private boolean inside(char[][] board, int x, int y) {return x >= 0 && x < board.length && y >= 0 && y < board[0].length;}
}

class TrieNode {			//定义字典树的节点String word;HashMap<Character, TrieNode> children;   //使用HashMap动态开节点public TrieNode() {word = null;children = new HashMap<Character, TrieNode>();}
};class TrieTree{TrieNode root;public TrieTree(TrieNode TrieNode) {root = TrieNode;}public void insert(String word) {		//字典树插入单词TrieNode node = root;for (int i = 0; i < word.length(); i++) {		if (!node.children.containsKey(word.charAt(i))) {node.children.put(word.charAt(i), new TrieNode());}node = node.children.get(word.charAt(i));}node.word = word;}
};public class Solution {/*** @param board: A list of lists of character* @param words: A list of string* @return: A list of string*/public int[] dx = {1, 0, -1, 0};   //搜索方向public int[] dy = {0, 1, 0, -1};public void search(char[][] board,			//在字典树上dfs查找int x,int y,TrieNode root,List<String> results) {if (!root.children.containsKey(board[x][y])) {return;}TrieNode child = root.children.get(board[x][y]);if (child.word != null) {      //如果访问到字典树叶子,将字符串压入result即可if (!results.contains(child.word)) {results.add(child.word);}}char tmp = board[x][y];board[x][y] = 0;  // mark board[x][y] as usedfor (int i = 0; i < 4; i++) {      //向四个方向dfs搜索if (!isValid(board, x + dx[i], y + dy[i])) {continue;}search(board, x + dx[i], y + dy[i], child, results);}board[x][y] = tmp;  // revert the mark}private boolean isValid(char[][] board, int x, int y) {     //检测搜索位置合法if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {return false;}return board[x][y] != 0;}public List<String> wordSearchII(char[][] board, List<String> words) {List<String> results = new ArrayList<String>();TrieTree tree = new TrieTree(new TrieNode());for (String word : words){tree.insert(word);}for (int i = 0; i < board.length; i++) {				//遍历字母矩阵,将每个字母作为单词首字母开始搜索for (int j = 0; j < board[i].length; j++) {search(board, i, j, tree.root, results);}}return results;}
}

struct Node {					//定义字典树的节点Node * ch[26];				//因为有26个英文字母,开26个长度string str;Node() {for (int i = 0; i < 26; ++i)   ch[i] = NULL;str = "";}
};class Solution {
public:vector<string> results;Node * root;void insert(Node* p, string s) {			//字典树插入单词int len = s.size();for (int i = 0; i < len; ++i) {if (p->ch[s[i]-'a'] == NULL)		//如果当前节点为空p->ch[s[i]-'a'] = new Node();	//新建节点p = p->ch[s[i]-'a'];                //继续遍历}   p->str = s;								//最后一个节点保存字符串}void search(vector<vector<char> > &board, vector<vector<bool> > &mask, Node* p, int x, int y) {  //在字典树上dfs查找if (p->str != "") {				//如果访问到字典树叶子,将字符串压入result即可results.push_back(p->str);p->str = "";}mask[x][y] = false;			//标记mask[x][y],避免重复访问if (y + 1 < board[0].size() && mask[x][y+1] && p->ch[board[x][y+1]-'a'] != NULL) {  //访问[x][y+1]search(board,mask, p->ch[board[x][y+1]-'a'], x, y+1);}if (x + 1 < board.size() && mask[x+1][y] && p->ch[board[x+1][y]-'a'] != NULL) {	//访问[x+1][y]search(board,mask, p->ch[board[x+1][y]-'a'], x+1, y);}if (y - 1 >= 0 && mask[x][y-1] && p->ch[board[x][y-1]-'a'] != NULL) {		//访问[x][y-1]search(board,mask, p->ch[board[x][y-1]-'a'], x, y-1);}if (x - 1 >= 0 && mask[x-1][y] && p->ch[board[x-1][y]-'a'] != NULL) {	//访问[x-1][y]search(board,mask, p->ch[board[x-1][y]-'a'], x-1, y);}mask[x][y] = true;				//搜索后mask[x][y]可以访问}/*** @param board: A list of lists of character* @param words: A list of string* @return: A list of string*/vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) {// write your code hereroot = new Node();int len = words.size();for (int i = 0; i < len; ++i) { 		//插入单词构造字典树insert(root, words[i]);}vector<vector<bool> > mask(board.size(), vector<bool>(board[0].size(), true));if (board.size() < 1) return results;for (int i = 0; i <board.size(); ++i) {		//遍历字母矩阵,将每个字母作为单词首字母开始搜索for (int j = 0; j < board[0].size(); ++j) {if (root->ch[board[i][j]-'a'] != NULL) {			search(board, mask, root->ch[board[i][j]-'a'], i, j);  //开始dfs搜索}}}return results;}
};

http://www.dtcms.com/a/503364.html

相关文章:

  • css `dorp-shadow`
  • 做网站内容管理器要吗免费的网站制作
  • 有限理性的边界与超越:人类如何在认知局限中走向更明智的决策
  • 【参赛心得】从“碰一碰”到“服务流转”:HarmonyOS创新赛金奖作品“智游文博”全流程复盘!
  • 网站推广服务报价表动态门户网站建设价格
  • 网站建设公司的排名濮阳市做网站
  • 【金仓数据库产品体验官】实战测评:电科金仓数据库接口兼容性深度体验
  • RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装
  • google外贸网站推广企业的网站公告怎么制作
  • Spring 源码学习(十四)—— HandlerMethodArgumentResolver
  • Git拉取代码报无权限的错误处理方案
  • 棋牌网站管理后台嗅探查找方法(2025最新)
  • 沈阳微信网站建设大连网站建设开发
  • 中英文企业网站模板wordpress插件 标签
  • 生成式引擎优化(GEO):五大 AI 引擎赋能多场景的技术与实践指南
  • 从邮票到Labubu:四十年中国收藏与潮流风潮的演变逻辑
  • 天猫网站左侧导航是怎么做的青岛建站推广
  • Linux中I2C常见问题三
  • C++初阶(14)list
  • python进阶刷题8
  • 完成职教集团网站建设唐山市做网站
  • 19.7 ChatPPT v2.0语音识别实战:3秒极速响应+88.7%准确率的Whisper模型黑科技
  • Cortex-M3 内核 MCU-STM32F1 开发之路:(二)寄存器地址的计算
  • 完整开发网站需要什么访问域名
  • Photoshop - Photoshop 工具栏(14)抓手工具
  • MySQL 之索引为什么选择B+树
  • seo网站页面f布局如何做企业文化培训
  • C语言-数组
  • 01-(JavaWeb)前端部分(HTML+CSS)
  • Sendable装饰器的使用