leetcode weekly contest 396
T4 确实是比较难的题目,非常不错的题目。
3136. 有效单词
有效单词 需要满足以下几个条件:
- 至少 包含 3 个字符。
- 由数字 0-9 和英文大小写字母组成。(不必包含所有这类字符。)
- 至少 包含一个 元音字母 。
- 至少 包含一个 辅音字母 。
给你一个字符串 word 。如果 word 是一个有效单词,则返回 true ,否则返回 false 。
注意:
'a'、'e'、'i'、'o'、'u'及其大写形式都属于 元音字母 。- 英文中的 辅音字母 是指那些除元音字母之外的字母。
示例 1:
输入:word = “234Adas”
输出:true
解释:
这个单词满足所有条件。
示例 2:
输入:word = “b3”
输出:false
解释:
这个单词的长度少于 3 且没有包含元音字母。
示例 3:
输入:word = “a3$e”
输出:false
解释:
这个单词包含了 '$' 字符且没有包含辅音字母。
提示:
1 <= word.length <= 20word由英文大写和小写字母、数字、'@'、'#'和'$'组成。
地址
https://leetcode.cn/contest/weekly-contest-396/problems/valid-word/
题意
直接模拟
思路
- 直接模拟即可,题目出的非常不好,细节处理问题较多,直接模拟即可。
- 复杂度分析:
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。
代码
class Solution { |
3137. K 周期字符串需要的最少操作次数
给你一个长度为 n 的字符串 word 和一个整数 k ,其中 k 是 n 的因数。
在一次操作中,你可以选择任意两个下标 i 和 j,其中 0 <= i, j < n ,且这两个下标都可以被 k 整除,然后用从 j 开始的长度为 k 的子串替换从 i 开始的长度为 k 的子串。也就是说,将子串 word[i..i + k - 1] 替换为子串 word[j..j + k - 1] 。
返回使 word 成为 K 周期字符串 所需的 最少 操作次数。
如果存在某个长度为 k 的字符串 s,使得 word 可以表示为任意次数连接 s ,则称字符串 word 是 K 周期字符串 。例如,如果 word == "ababab",那么 word 就是 s = "ab" 时的 2 周期字符串 。
示例 1:
输入:word = “leetcodeleet”, k = 4
输出:1
解释:可以选择 i = 4 和 j = 0 获得一个 4 周期字符串。这次操作后,word 变为 “leetleetleet” 。
示例 2:
输入:word = “leetcoleet”, k = 2
输出:3
解释:可以执行以下操作获得一个 2 周期字符串。
| i | j | word |
|---|---|---|
| 0 | 2 | etetcoleet |
| 4 | 0 | etetetleet |
| 6 | 0 | etetetetet |
提示:
1 <= n == word.length <= 1051 <= k <= word.lengthk能整除word.length。word仅由小写英文字母组成。
地址
题意
哈希统计
思路
- 依次统计字符串中连续长度为 $k$ 的字符串,统计出现次数最多的字符串即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定的字符串的长度。
- 空间复杂度:$O(n)$,其中 $n$ 表示给定的字符串的长度。
代码
class Solution: |
use std::collections::HashMap; |
3138. 同位字符串连接的最小长度
给你一个字符串 s ,它由某个字符串 t 和若干 t 的 同位字符串 连接而成。
请你返回字符串 t 的 最小 可能长度。
同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。
示例 1:
输入:s = “abba”
输出:2
解释:
一个可能的字符串 t 为 "ba" 。
示例 2:
输入:s = “cdef”
输出:4
解释:
一个可能的字符串 t 为 "cdef" ,注意 t 可能等于 s 。
提示:
1 <= s.length <= 105s只包含小写英文字母。
地址
https://leetcode.cn/contest/weekly-contest-396/problems/minimum-length-of-anagram-concatenation/
题意
数学
思路
对于两个字符串 $s,t$ ,判断其是否为同位字符串,方法比较简单,我们只需要要比较 $s,t$ 中所有的字符数目是否相等即可,按照题目要求需要找到同位字符串的最小连接长度,我们依次从小到大枚举长度 $l$ 即可,此时需要满足 $n \mod l = 0$ 即可,即 $l$ 一定是 $n$ 的因子,此时我们直接枚举 $l$ 即可,对于给定的整数 $n$ ,它最多有 $\log n$ 个因子,我们直接枚举即可,并检测在长度 $l$ 下,字符串 $s$ 分割程长度为 $l$ 的子字符串是否满足均为同位字符串即可。
复杂度:
- 时间复杂度:$O(n \log n |\Sigma|)$,其中 $n$ 表示给定的字符串的长度,$|\Sigma|$ 表示字符集的数目;
- 空间复杂度:$O(|\Sigma|)$;
代码
class Solution: |
impl Solution { |
3139. 使数组中所有元素相等的最小开销
给你一个整数数组 nums 和两个整数 cost1 和 cost2 。你可以执行以下 任一 操作 任意 次:
- 从
nums中选择下标i并且将nums[i]增加1,开销为cost1。 - 选择
nums中两个 不同 下标i和j,并且将nums[i]和nums[j]都 增加1,开销为cost2。
你的目标是使数组中所有元素都 相等 ,请你返回需要的 最小开销 之和。
由于答案可能会很大,请你将它对 109 + 7 取余 后返回。
示例 1:
输入:nums = [4,1], cost1 = 5, cost2 = 2
输出:15
解释:
执行以下操作可以使数组中所有元素相等:
- 将
nums[1]增加 1 ,开销为 5 ,nums变为[4,2]。 - 将
nums[1]增加 1 ,开销为 5 ,nums变为[4,3]。 - 将
nums[1]增加 1 ,开销为 5 ,nums变为[4,4]。
总开销为 15 。
示例 2:
输入:nums = [2,3,3,3,5], cost1 = 2, cost2 = 1
输出:6
解释:
执行以下操作可以使数组中所有元素相等:
- 将
nums[0]和nums[1]同时增加 1 ,开销为 1 ,nums变为[3,4,3,3,5]。 - 将
nums[0]和nums[2]同时增加 1 ,开销为 1 ,nums变为[4,4,4,3,5]。 - 将
nums[0]和nums[3]同时增加 1 ,开销为 1 ,nums变为[5,4,4,4,5]。 - 将
nums[1]和nums[2]同时增加 1 ,开销为 1 ,nums变为[5,5,5,4,5]。 - 将
nums[3]增加 1 ,开销为 2 ,nums变为[5,5,5,5,5]。
总开销为 6 。
示例 3:
输入:nums = [3,5,3], cost1 = 1, cost2 = 3
输出:4
解释:
执行以下操作可以使数组中所有元素相等:
- 将
nums[0]增加 1 ,开销为 1 ,nums变为[4,5,3]。 - 将
nums[0]增加 1 ,开销为 1 ,nums变为[5,5,3]。 - 将
nums[2]增加 1 ,开销为 1 ,nums变为[5,5,4]。 - 将
nums[2]增加 1 ,开销为 1 ,nums变为[5,5,5]。
总开销为 4 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 1061 <= cost1 <= 1061 <= cost2 <= 106
地址
https://leetcode.cn/contest/weekly-contest-396/problems/minimum-cost-to-equalize-array/
题意
数学,贪心
思路
- 本题确实是个非常非常不错的思维题目,最喜欢的是这类思考性质的题目。我们首先要思考一个简单的问题,假设给定的数组,每次可以从数组中取两个不同的元素,将其减少 $1$,最多可以操作多少次?此时可以参考「1953. 你可以工作的最大周数」,设数组的总元素的和为 $sum$,数组中最大的元素为 $x$,此时可以直到有两种情况:
- 如果 $x <= sum - x$,我们一定可以将所有的元素都变为 $0$,操作次数即为 $\dfrac{sum}{2}$;
- 如果 $x > sum - x$,我们无法将所有不同的元素进行配对,操作次数即为 $\min(x, sum - x)$ 次;
- 回到题目本身,我们需要分类讨论:
当数组元素小于等于 $2$ 个时,如果两个元素不相等,此时哦我们只能利用操作 $1$,无法利用操作 $2$;
当 $2 * cost_1 \le cost_2$ 时,我们肯定是利用第一种操作的代价更小,此时最终的目标元素即为数组中的最大值;
当 $2 * cost_1 > cost_2$ 时,此时我们应该尽可能的使用操作 $2$ 才能使得代价最少。我们知道上述问题的解答方法后,再回到题目本身,对给定的数组 $nums$,我们要使得数组中所有元素相等,至少我们需要使得数组中的所有元素都与数组中的最大值相等。
- 假设已知数组中的最大值为 $x$,此时求出每个元素与 $x$ 的差值,每次从差值中取出 $2$ 个元素,因此此时我们至少需要将数组中所有的元素都增加到 $x$,此时根据前述分析此时需要的代价为 $(n \times x - sum) \times cost_1$;
- 每次取两个数增加比两次增加一个数的代价要小,此时我们应该尽可能的使用两个数的操作次数,假设我们将所有元素都增加到 $x$,此时需要的代价分两种即为:
- 如果 $x \le sum - x$,此时最多可以进行 $\frac{(nx - sum)}{2}$ 次操作 $2$,需要 $(nx - sum) & 1$ 次操作 $1$,需要的代价即为 $\lfloor \dfrac{(nx - sum)}{2} \rfloor + (nx - sum) & 1$;
- 如果 $x > sum - x$,此时最多可以进行 $sum - x$ 次操作 $2$,需要 $2x - sum$ 次操作 $1$,需要的代价即为 $(sum -x) \times cost_2 + (2x - sum) \times cost_1$;
- 但是我们需要继续明白一个问题, $x$ 的上限应该是多少?我们知道每次应该尽可能的使用操作 $2$,当 $x$ 增加到一定程度后,此时所有的操作已经都是操作 $2$ 时,此时继续增加 $x$ 就没有任何意义,此时我们需要计算这个上限制,即我们找到最小的 $x$ 使得所有的操作都可以使用操作 $2$ 完成即为上限制,此时需要满足两个条件:
- 设数组中最大的元素为 $maxval$,此时数组中原有元素的之和为 $sum$,此时由于数组中所有的元素都需要增加到 $x$,此时
- 复杂度分析:
- 时间复杂度:$O(n + U)$,其中 $n$ 表示数组的长度, $U$ 表示数组中的最大元素;
- 空间复杂度:$O(1)$;
代码
class Solution: |
欢迎关注和打赏,感谢支持!
关注我的博客: https://mike-box.github.io/
关注我的微信公众号: 哪些奋斗者

扫描二维码,分享此文章