leetcode contest 378
整体来说题目还算有点难度,不过倒不是特别变态的题目,难度还可以接受。几个题目倒是都不需要什么技巧。
2980. 检查按位或是否存在尾随零
给你一个 正整数 数组 nums
。
你需要检查是否可以从数组中选出 两个或更多 元素,满足这些元素的按位或运算( OR
)结果的二进制表示中 至少 存在一个尾随零。
例如,数字 5
的二进制表示是 "101"
,不存在尾随零,而数字 4
的二进制表示是 "100"
,存在两个尾随零。
如果可以选择两个或更多元素,其按位或运算结果存在尾随零,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,4,5] |
示例 2:
输入:nums = [2,4,8,16] |
示例 3:
输入:nums = [1,3,5,7,9] |
提示:
2 <= nums.length <= 100
1 <= nums[i] <= 100
地址
https://leetcode.cn/contest/weekly-contest-378/problems/check-if-bitwise-or-has-trailing-zeros/
题意
直接模拟即可
思路
- 统计数组中偶数的数目是否大于 $1$ 即可。
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution: |
2981. 找出出现至少三次的最长特殊子字符串 I
给你一个仅由小写英文字母组成的字符串 s
。
如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc"
不是特殊字符串,而字符串 "ddd"
、"zz"
和 "f"
是特殊字符串。
返回在 s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1
。
子字符串 是字符串中的一个连续 非空 字符序列。
示例 1:
输入:s = "aaaa" |
示例 2:
输入:s = "abcdef" |
示例 3:
输入:s = "abcaba" |
提示:
3 <= s.length <= 50
s
仅由小写英文字母组成。
地址
题意
二分查找
思路
- 给定相同字符串的长度为 $x$, 此时可以组成长度为 $x$ 的字串数目为 $x - l + 1$ 个,我们可以利用二分查找,找到每种字符可以组成数目大于 $3$ 的连续字符串的最大长度即可。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 表示给定的字符串的长度。
- 空间复杂度:$O(n)$,其中 $n$ 表示给定的字符串的长度。
代码
class Solution: |
2982. 找出出现至少三次的最长特殊子字符串 II
给你一个仅由小写英文字母组成的字符串 s
。
如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc"
不是特殊字符串,而字符串 "ddd"
、"zz"
和 "f"
是特殊字符串。
返回在 s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1
。
子字符串 是字符串中的一个连续 非空 字符序列。
示例 1:
输入:s = "aaaa" |
示例 2:
输入:s = "abcdef" |
示例 3:
输入:s = "abcaba" |
提示:
3 <= s.length <= 5 * 105
s
仅由小写英文字母组成。
地址
题意
二分查找
思路
- 给定相同字符串的长度为 $x$, 此时可以组成长度为 $x$ 的字串数目为 $x - l + 1$ 个,我们可以利用二分查找,找到每种字符可以组成数目大于 $3$ 的连续字符串的最大长度即可。
- 复杂度分析:
- 时间复杂度:$O(n \log n)$,其中 $n$ 表示给定的字符串的长度。
- 空间复杂度:$O(n)$,其中 $n$ 表示给定的字符串的长度。
代码
class Solution: |
2983. 回文串重新排列查询
给你一个长度为 偶数 n
,下标从 0 开始的字符串 s
。
同时给你一个下标从 0 开始的二维整数数组 queries
,其中 queries[i] = [ai, bi, ci, di]
。
对于每个查询 i
,你需要执行以下操作:
- 将下标在范围
0 <= ai <= bi < n / 2
内的 子字符串s[ai:bi]
中的字符重新排列。 - 将下标在范围
n / 2 <= ci <= di < n
内的 子字符串s[ci:di]
中的字符重新排列。
对于每个查询,你的任务是判断执行操作后能否让 s
变成一个 回文串 。
每个查询与其他查询都是 独立的 。
请你返回一个下标从 0 开始的数组 answer
,如果第 i
个查询执行操作后,可以将 s
变为一个回文串,那么 answer[i] = true
,否则为 false
。
- 子字符串 指的是一个字符串中一段连续的字符序列。
s[x:y]
表示s
中从下标x
到y
且两个端点 都包含 的子字符串。
示例 1:
输入:s = "abcabc", queries = [[1,1,3,5],[0,2,5,5]] |
示例 2:
输入:s = "abbcdecbba", queries = [[0,2,7,9]] |
示例 3:
输入:s = "acbcab", queries = [[1,2,4,5]] |
提示:
2 <= n == s.length <= 105
1 <= queries.length <= 105
queries[i].length == 4
ai == queries[i][0], bi == queries[i][1]
ci == queries[i][2], di == queries[i][3]
0 <= ai <= bi < n / 2
n / 2 <= ci <= di < n
n
是一个偶数。s
只包含小写英文字母。
地址
https://leetcode.cn/contest/weekly-contest-378/problems/palindrome-rearrangement-queries/
题意
动态规划
思路
题目本身倒不是特别难,但是感觉需要考虑的细节比较多,需要仔细的思考处理好细节,否则非常容易出错的题目,首先我们将数组的前后部分进行预处理,将数组的后半部分进行反转,设 $s = s[0\cdots \frac{n}{2}], t = [\frac{n}{2}\cdots n]$;只需要排序使得 $s =t$ 相等即可,
给定的 $a,b,c,d$,此时需要将其转换为 $s,t$ 中的索引分别为 $l_1 = a,r_1 = b,l_2 = 2m-1-d, r_2 = 2m-1-c$;
此时只需要排序 $s[l_1\cdots r_1],t[l_2\cdots r_2]$ 使得 $s = t$ 相等即可,设 $l = \min(l_1,l_2), r = \max(r_1,r_2)$ 实际分为以下几种情况来检测:
首先我们需要使得两个字符串未进行排序的区域相等,此时需要检测 $s[0\cdots l-1] = t[0\cdots l-1],s[r+1\cdots n-1] = t[r+1\cdots n -1]$,即未排序的部分一定相等;
其次我们检测在需要进行排序的区间 $[l,r]$ 中, $s[l\cdots r]$ 与 $t[l\cdots r]$ 二者的字符种类与数据均相等;
第一种情况区间 $[l_1,r_1],[l_2,r_2]$ 不存在相交的时候,即此时还需要保证 $s[l1\cdots r_1]$ 与 $t[l1\cdots r_1]$ 的字符相等,此时 $s[\min(r_1,r_2) \cdots max(l_1,l_2)] = t[\min(r_1,r_2) \cdots max(l_1,l_2)]$,同时保证 $s[l_2\cdots r_2]$ 与 $t[l_2\cdots r_2]$的字符相等即可,我们利用动态规划记录两个字符串相等的最长长度,同时用前缀和保存当前每个不同字符的前缀和,我们判断中间不相交的部分字符串是否想等,相交的地方字符是否相等即可;
第二种情况区间 $[l_1,r_1],[l_2,r_2]$ 在相交,即此时此时我们需要不管需要区间 $[l,r]$ 之间的字符相等,还需要检测是否需要交换位置的字符 $a$,此时是否刚好都分布在两个字符串 $s,t$ 的无法排序交换的部分,比如此时 $’w’$ 刚好分布在字符串 $s$ 无法排序的区域,$’w’$ 同时也分布在 $t$ 的无法排序的区域,此时无法如何排序都无法使得两个字符串相等,
.png)
复杂度分析:
- 时间复杂度:$O(n + m \times |\Sigma|)$,其中 $n$ 表示给定的字符串的长度,$m$ 表示给查询数组的长度;
- 空间复杂度:$O(n \times |\Sigma|)$,其中 $n$ 表示给定的字符串的长度;
代码
class Solution: |
欢迎关注和打赏,感谢支持!
扫描二维码,分享此文章