边做算法边学go语言之LeetCode1160:拼写单词

简介: 边做算法边学go语言之LeetCode1160:拼写单词

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDMtMDctMTQwNzE1LmpwZw.png

前言

本系列文章为《leetcode》刷题笔记。

题目位置:拼写单词

题集:LeetCode

项目位置:我的Github项目


题目


给你一份『词汇表』(字符串数组words 和一张『字母表』(字符串) chars

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。


注意:每次拼写时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和。

示例 1:

输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释: 
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。


示例 2:


输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。


提示:


1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100


所有字符串中都仅包含小写英文字母


思路


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzU0NWJlMzMxMzk2NzdlNWVmOGRlNTI3MjU1YzkzZDExYjIxZmZjNzdhMDIwZjIyY2FiZWMyNzc5Zjk1ZTA0MTUuZ2lm.gif


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzU0NWJlMzMxMzk2NzdlNWVmOGRlNTI3MjU1YzkzZDExYjIxZmZjNzdhMDIwZjIyY2FiZWMyNzc5Zjk1ZTA0MTUuZ2lm.gif

如上图,这是一题hash table的题目,非常简单,先用一个map统计chars中的字母数量,然后遍历给的字符串数组,逐个统计,对比即可。

统计chars中的字母数量(int类型自动初始化为0)


cmap := make(map[uint8]int)
  for i := 0; i < len(chars); i++ {
    cmap[chars[i]] ++
  }

遍历单词集合

for i := 0; i < len(words); i++ {


map拷贝(原理是序列化成json,再反序列化回来)

ExtractInto(cmap, &tmpMap)



遍历单词中的每个字母, 只要没在chars的字典中出现就判断失败,一旦出现就让当前字符字典数量--

j := 0
    for ; j < len(words[i]); j++ {
      if tmpMap[words[i][j]] <= 0 {
        break
      }
      tmpMap[words[i][j]] --
    }

如果j等于了当前单词长度,说明所有字母都包含在里面,就统计上。


if j == len(words[i]) {
      count += len(words[i])
    }


可惜啊。。


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDMtMTctMTc0NDEyLnBuZw.png


估计是map本身寻找hash位置耗时,以及map拷贝耗时优化一下代码,把map转换成数组。

长度为26个字母,下标就是0-25,也就是a-a到z-a。

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDMtMTgtMDUxNjE3LmpwZw.png


详细代码如下一节优化后。


代码


优化前

Go


func countCharacters(words []string, chars string) int {
  cmap := make(map[uint8]int)
  for i := 0; i < len(chars); i++ {
    cmap[chars[i]] ++
  }
  count := 0
  tmpMap := make(map[uint8]int)
  for i := 0; i < len(words); i++ {
    ExtractInto(cmap, &tmpMap)
    j := 0
    for ; j < len(words[i]); j++ {
      if tmpMap[words[i][j]] <= 0 {
        break
      }
      tmpMap[words[i][j]] --
    }
    if j == len(words[i]) {
      count += len(words[i])
    }
  }
  return count
}
/*
  把interface类型转换成我们想要的struct类型
  这个通用方法可以转换成任意一个想要的类型
 */
func ExtractInto(source interface{}, to interface{}) error {
  b, err := json.Marshal(source)
  if err != nil {
    return err
  }
  err = json.Unmarshal(b, to)
  return err
}

优化后

Go

//优化后
func countCharacters(words []string, chars string) int {
  var byteCount [26]int
  for _, char := range chars {
    byteCount[char-'a']++
  }
  ret := 0
  for _, word := range words {
    bc, match := byteCount, true
    for _, char := range word {
      if bc[char-'a'] <= 0 {
        match = false
        break
      }
      bc[char-'a']--
    }
    if match {
      ret += len(word)
    }
  }
  return ret
}


目录
打赏
0
0
0
0
1
分享
相关文章
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
42 15
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
14 1
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
262 7
|
23天前
|
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
31 3
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
|
25天前
|
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
28 0
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等