Golang每日一练(leetDay0074) 词典类设计、单词搜索II

news2025/1/16 17:00:54

目录

211. 添加与搜索单词 - 数据结构设计 Design-add-and-search-words-data-structure  🌟🌟

212. 单词搜索 II Word Search ii 🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


211. 添加与搜索单词 - 数据结构设计 Design-add-and-search-words-data-structure

请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

实现词典类 WordDictionary :

  • WordDictionary() 初始化词典对象
  • void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
  • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回  false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。

示例:

输入:
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
输出:
[null,null,null,null,false,true,true,true]

解释:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // 返回 False
wordDictionary.search("bad"); // 返回 True
wordDictionary.search(".ad"); // 返回 True
wordDictionary.search("b.."); // 返回 True

提示:

  • 1 <= word.length <= 25
  • addWord 中的 word 由小写英文字母组成
  • search 中的 word 由 '.' 或小写英文字母组成
  • 最多调用 10^4 次 addWord 和 search

代码:

package main

import "fmt"

type TrieNode struct {
	children [26]*TrieNode
	isWord   bool
}

type WordDictionary struct {
	root *TrieNode
}

func Constructor() WordDictionary {
	return WordDictionary{root: &TrieNode{}}
}

func (this *WordDictionary) AddWord(word string) {
	node := this.root
	for _, ch := range word {
		idx := ch - 'a'
		if node.children[idx] == nil {
			node.children[idx] = &TrieNode{}
		}
		node = node.children[idx]
	}
	node.isWord = true
}

func (this *WordDictionary) Search(word string) bool {
	return this.match(this.root, word, 0)
}

func (this *WordDictionary) match(node *TrieNode, word string, idx int) bool {
	if node == nil {
		return false
	}
	if idx == len(word) {
		return node.isWord
	}
	ch := word[idx]
	if ch != '.' {
		child := node.children[ch-'a']
		if child != nil && this.match(child, word, idx+1) {
			return true
		}
	} else {
		for _, child := range node.children {
			if child != nil && this.match(child, word, idx+1) {
				return true
			}
		}
	}
	return false
}

func main() {
	wordDictionary := Constructor()
	wordDictionary.AddWord("bad")
	wordDictionary.AddWord("dad")
	wordDictionary.AddWord("mad")
	fmt.Println(wordDictionary.Search("pad"))
	fmt.Println(wordDictionary.Search("bad"))
	fmt.Println(wordDictionary.Search(".ad"))
	fmt.Println(wordDictionary.Search("b.."))
}

输出:

false
true
true
true


212. 单词搜索 II Word Search ii

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。

单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例 1:

输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]

示例 2:

输入:board = [["a","b"],["c","d"]], words = ["abcb"]
输出:[]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 12
  • board[i][j] 是一个小写英文字母
  • 1 <= words.length <= 3 * 10^4
  • 1 <= words[i].length <= 10
  • words[i] 由小写英文字母组成
  • words 中的所有字符串互不相同

相关题目:  单词搜索 I Word Search i

https://hannyang.blog.csdn.net/article/details/129971403#t0

代码1: 哈希表 + dfs

package main

import "fmt"

type entry struct {
	row, col int
}

func findWords(board [][]byte, words []string) []string {
	n, m := len(board), len(board[0])
	wordIndex := make(map[string]int)
	for i, word := range words {
		wordIndex[word] = i
	}
	visited := make([][]bool, n)
	for i := range visited {
		visited[i] = make([]bool, m)
	}
	dirs := []entry{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

	var res []string
	var dfs func(string, int, int)
	dfs = func(cur string, i, j int) {
		if idx, ok := wordIndex[cur]; ok {
			res = append(res, words[idx])
			delete(wordIndex, cur)
		}
		for _, dir := range dirs {
			ni, nj := i+dir.row, j+dir.col
			if ni < 0 || ni >= n || nj < 0 || nj >= m || visited[ni][nj] {
				continue
			}
			visited[ni][nj] = true
			dfs(cur+string(board[ni][nj]), ni, nj)
			visited[ni][nj] = false
		}
	}

	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			visited[i][j] = true
			dfs(string(board[i][j]), i, j)
			visited[i][j] = false
		}
	}
	return res
}

func main() {
	board := [][]byte{{'o', 'a', 'a', 'n'}, {'e', 't', 'a', 'e'}, {'i', 'h', 'k', 'r'}, {'i', 'f', 'l', 'v'}}
	words := []string{"oath", "pea", "eat", "rain"}
	fmt.Println(findWords(board, words))
}

代码2: 前缀树 Trie

package main

import "fmt"

type TrieNode struct {
	ch       byte
	children [26]*TrieNode
	word     string
}
type Trie struct {
	root *TrieNode
}

func NewTrie() *Trie {
	return &Trie{root: &TrieNode{}}
}

func (t *Trie) Insert(word string) {
	node := t.root
	for i := 0; i < len(word); i++ {
		ch := word[i]
		if idx := ch - 'a'; idx >= 0 && idx < 26 {
			if node.children[idx] == nil {
				node.children[idx] = &TrieNode{ch: ch}
			}
			node = node.children[idx]
		} else {
			return
		}
	}
	node.word = word
}

func findWords(board [][]byte, words []string) []string {
	trie := NewTrie()
	for _, word := range words {
		trie.Insert(word)
	}
	visited := make([][]bool, len(board))
	for i := 0; i < len(board); i++ {
		visited[i] = make([]bool, len(board[0]))
	}
	var res []string
	var dfs func(node *TrieNode, i, j int)
	dfs = func(node *TrieNode, i, j int) {
		if node.word != "" {
			res = append(res, node.word)
			node.word = "" // 避免重复添加
		}
		if i < 0 || i >= len(board) || j < 0 || j >= len(board[0]) {
			return
		}
		if visited[i][j] || node.children[board[i][j]-'a'] == nil {
			return
		}
		visited[i][j] = true
		idx := board[i][j] - 'a'
		child := node.children[idx]
		dfs(child, i-1, j)
		dfs(child, i+1, j)
		dfs(child, i, j-1)
		dfs(child, i, j+1)
		visited[i][j] = false
	}
	for i := 0; i < len(board); i++ {
		for j := 0; j < len(board[0]); j++ {
			dfs(trie.root, i, j)
		}
	}
	return res
}

func main() {
	board := [][]byte{{'o', 'a', 'a', 'n'}, {'e', 't', 'a', 'e'}, {'i', 'h', 'k', 'r'}, {'i', 'f', 'l', 'v'}}
	words := []string{"oath", "pea", "eat", "rain"}
	fmt.Println(findWords(board, words))
}

输出:

[oath eat]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于C#和Blazor开发的前后端分离框架

Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 开源地址 https://gitee.com/known/Known 开发环境 .NET 7VS2022 概述 基于C#和Blazor实现的快速开发框架&#xff0c;前后端分离…

【深度学习】- 作业4: 脑部MRI(核磁共振)图像分别

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

【数据结构与算法】- 周测四

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

三、尚医通医院管理实现

文章目录 三、医院管理实现1、医院列表1.1 医院列表api接口1.1.1 添加service分页接口与实现1.1.2 添加controller方法 1.2 service-cmn模块提供接口1.2.1添加service接口与实现1.2.2添加controller方法 1.3封装Feign服务调用1.3.1搭建service-client父模块1.3.2 搭建service-c…

微生物实验之分菌(细菌)

文章目录 1. 采集实验样本2. 对实验样本进行处理1. 土壤样本的处理2. 植物内生菌样本的处理 3. 接种4. 分离纯化5. 测16s6. 测全基因组7. 保藏菌株 分离细菌菌株 (分菌) 是微生物学实验中&#xff0c;很重要的一环&#xff0c;对于微生物资源来说尤为重要。分菌主要包含以下几个…

人工智能CNN 卷积神经网络结构(tensorflow代码实现)

MNIST是一个简单的视觉计算数据集,它是像下面这样手写的数字图片: MNIST 通过上期的分享,我们了解了手写数字识别的基本原理以及CNN卷积神经网络的基本原理,本期我们结合MNIST数据集,来用代码来实现CNN。(手写数字识别是TensorFlow人工智能最基础的案例,这个跟学习编程…

删除表单(form)元素中的某一个数据项操作实现

问题 对于表单&#xff08;form&#xff09;元素&#xff0c;只支持POST请求。若是需要删除表单&#xff08;form&#xff09;元素中的某一个数据项&#xff0c;最为严谨的方式是采用POST请求&#xff0c; 对于表单元素&#xff0c;如何转换为DELETE请求 详细问题 对于表单元…

AC规则-2

基于RAM的远程接口 安全元件的访问规则可以通过远程应用程序管理 (RAM) 更新命令进行管理。 因此&#xff0c;ARA-M 和 ARA-C 各自提供一个远程接口&#xff0c;允许在 ARA 中存储或删除访问规则。 访问控制数据的任何远程管理都应仅通过 [GP 卡规范] 定义的安全通道协议来完成…

『树莓派云台机器人』01. 使用手机控制机器人

目录 1. 检查是否已经开机&#xff0c;连接机器人wifi2. 安装树莓派控制app应用&#xff0c;直连模式连接机器人3. 机器人功能实现总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 动手组装等步骤请…

chatgpt赋能Python-python_erode

Python Erode&#xff1a;用Python实现图像腐蚀 图像处理是人工智能领域的重要分支&#xff0c;Python是一种广泛应用于机器学习和深度学习的编程语言&#xff0c;也是图像处理领域的主要开发语言之一。在Python中&#xff0c;我们可以使用许多不同的库和工具来处理图像。其中…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-9

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-9 虚拟机类加载机制类加载的过程准备解析字段解析 方法解析接口方法解析 虚拟机类加载机制 类加载的过程 准备 准备阶段是正式为类中定义的变量&#xff08;即静态变量&#xff0c;被static修饰的变量&#xff09…

检测字符串中所有的字母是否都为大写(字符中的数字、符号和空格不起作用)isupper()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 检测字符串中所有的字母是否都为大写 &#xff08;字符中的数字、符号和空格不起作用&#xff09; isupper() 选择题 以下程序的运行结果是? print("【执行】print(PYTHON.isupper())&qu…

chatgpt赋能Python-python_endif

Python Endif: 程序员必备的关键字 如果你是一位有经验的Python程序员&#xff0c;那么你一定非常熟悉Python中的一个关键字&#xff1a;Endif。本文将深入介绍Endif&#xff0c;帮助程序员更好地理解其作用和用法。 什么是Endif Endif是Python中的一个关键字&#xff0c;它…

【自然语言处理】- 作业5: 智能问答在法律智能领域的应用

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

Java如何连接数据库

Java连接MySQL数据库的方法&#xff1a;首先下载解压得到jar库文件&#xff0c;并在对应的项目中导入该库文件;然后添加JDBC;接着在Mysql数据库中进行建表&#xff0c;和添加数据的操作;最后连接数据库并读取数据即可。 Java 连接 MySQL数据库需要驱动包&#xff0c;解压后得到…

springboot国际化多语言配置

文章目录 概要springboot项目为例1 新建路径/文件2 新建两个配置类 搞一个控制器测试总结 概要 项目中有时候会用到多语言的业务场景; 一般来说都是通过后端实现的,将先有内容替换为适用的环境语言; springboot项目为例 1 新建路径/文件 新建路径static/i18n新建文件: mess…

【数据结构与算法】- 周测二

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

简单易懂:Ajax入门实例详解(登录功能)

前言&#xff1a;不积跬步无以至千里&#xff0c;不积小流无以成江河&#xff01; 废话不多&#xff0c;以最简练的语言和实例初步了解Ajax&#xff01; 一、Ajax简介 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种基于Web技术的编程实现方式&#xff0c…

【CCIG技术论坛回顾】展望AI时代,把握文档图像智能分析与处理的未来

展望AI时代&#xff0c;把握文档图像智能分析与处理的未来 前言 CCIG技术论坛 内容回顾及探讨一、人工智能大模型时代的文档识别与理解1.1 文档分析与识别 介绍1.2 文档识别历史回顾1.3 文档的种类与研究问题1.4 文档识别与理解研究现状1.5 大模型带来的挑战与机遇1.5.1 ChatGP…

chrome和Chromedriver版本不一致的问题,然后就要下载对应版本的chromedriver。

很多人会遇到chrome和Chromedriver版本不一致的问题&#xff0c;然后就要下载对应版本的chromedriver。 下面说一下我遇到的问题和解决过程&#xff1a; 1、问题&#xff1a; 我是用pythonselenium 我的chrome版本是65.0.3325.181&#xff0c;用selenium中的webdriver时&am…