golang力扣leetcode 691.贴纸拼词

简介: golang力扣leetcode 691.贴纸拼词

691.贴纸拼词

691.贴纸拼词

题解

题目:给你一个target字符串,再给你一个stickers字符串数组,数组元素可用重复拿取,问最少需要几个数组元素,才能用数组元素中出现过的字母,拼凑出target字符串。

思路:

1.既然可用重复拿取,说明只遍历一次数组是不够的
2.第一次用元素拼凑,可能不够,还要第二次,第二次需要的数量,与第一次拼凑之后的状态有关
3.对于这种当前状态与上一次状态有关的,用BFS来做
1.对target字符串中出现的字母计数,得到一个26长度的数组
2.对stickers字符串数组中每个字符串都计数,得到多个26长度的数组
3.遍历mapTarget,再遍历mapStickers ,用arrTar减去arrSticker得到新的数组状态temp
4.这个新的状态temp,是目标字符串减去某个字符串之后的状态,对于这个状态,就是下一轮的目标了
5.如果数组都是0,也就是等于zero ,说明拼凑成功了,直接返回
6.如果不是0,并且temp不在mapTarget中,则加入下一轮bfs中

代码

func minStickers(stickers []string, target string) (ans int) {
  mapTarget := make(map[[26]int]bool)   //存目标
  mapStickers := make(map[[26]int]bool) //存待使用
  mapTemp := make(map[[26]int]bool)     //存下一次目标
  zero := [26]int{}
  tar := [26]int{} //将target的字母出现次数计数到数组中
  for i := 0; i < len(target); i++ {
    tar[int(target[i]-97)]++
  }
  mapTarget[tar] = true
  for _, sticker := range stickers {
    temp := [26]int{}
    for i := 0; i < len(sticker); i++ {
      temp[int(sticker[i]-97)]++ //将sticker的字母出现次数计数到数组中
    }
    mapStickers[temp] = true
  }
  for len(mapTarget) != 0 {
    ans++
    for arrTar := range mapTarget {
      for arrSticker := range mapStickers {
        temp := [26]int{}
        for i := 0; i < 26; i++ {
          if arrTar[i]-arrSticker[i] >= 0 {
            temp[i] = arrTar[i] - arrSticker[i]
          }
        }
        if temp == zero {
          return ans
        } else if !mapTarget[temp] { //如果map中有过temp,则不用再存了,没有才存
          mapTemp[temp] = true
        }
      }
    }
    mapTarget = mapTemp //将待使用转正
    mapTemp = make(map[[26]int]bool)
  }
  return -1
}
目录
相关文章
|
1天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
4 0
|
1天前
|
Java
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
7 1
|
4月前
|
Go 容器 SQL
【Golang Leetcode】总目录(Day1~100)
【Golang Leetcode】总目录(Day1~100)
476 1
【Golang Leetcode】总目录(Day1~100)
|
4月前
|
Go
golang力扣leetcode 494.目标和
golang力扣leetcode 494.目标和
30 0
|
4月前
|
Go
golang力扣leetcode 剑指Offer II 114. 外星文字典
golang力扣leetcode 剑指Offer II 114. 外星文字典
21 0
|
1天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
6 0
|
1天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
7 0
|
2天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog
15 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
2天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
22 5

热门文章

最新文章