【Leetcode Daily】1234替换子串得到平衡字符串
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:491|阅读时长:2分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,给一个由 QWER 四个字母组成的字符串,可以变换其中的子字符串,使得四个字母数量相同,求变换的子字符串的最短长度。
思路分享
不定长滑动窗口的求“至少”应用,思路上基本同【Leetcode Daily】3090每个字符最多出现两次的最长字符串,下面主要讲讲灵茶山艾府在题解中可以借鉴的地方。
一个是数组的初始化,由于 ASCII 码的对应,其实用字符初始化数组数量是可以的,所以就有了
int rec['Z']{}这种写法。另一个是结果在窗口合法时更新,避免窗口不合法后,去猜合法情况的代码。这样做很容易把自己绕进去。
代码解答(强烈建议自行解答后再看)
- 参考解法
1 | class Solution { |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-05-08
【Leetcode Daily】1004最大连续1的个数III
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个由 0 和 1 组成的整数数组,现在最多可以把其中 k 个 0 反转成 1。求反转后最长连续 1 的个数。 思路分享 纯粹的不定长滑动窗口(【Leetcode Daily】3090每个字符最多出现两次的最长字符串),无需多盐。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617class Solution {public: int longestOnes(vector<int>& nums, int k) { int zero_count = 0; int left = 0; int n = nums.size(); int ans = 0; for (int i = 0; i < n;i++) { zero_count += 1-nums[i]; while(zero_count...

2025-04-24
【Leetcode Daily】1052爱生气的书店老板
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个整型数组,以及一个整数 minutes,按某个要求(具体看原题,难以简化),求一个数组在另一个数组和 minutes 约束下的求的最大值。 思路分享 陆爻齐的思路是计算窗口内(也就是冷静的分钟)不满意生气离开的最大值,加上不生气的心情值,再减去所有生气离开的数值得出答案,但由于思想复杂了点,所以略微修改模板结构,也就是下面陆爻齐的答案。 参照灵茶山艾府,其实只要区分开两部分相加即可,然后直接参照模板。这两部分,一个是不生气的值,一个是生气下的值,取生气下最大值即可。这样就不用像上面一样多一次运算。 https://leetcode.cn/problems/grumpy-bookstore-owner/solutions/2751888/ding-chang-hua-dong-chuang-kou-fu-ti-dan-rch7/ 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 12345678910111213141516171819202122232425class Solution...

2025-05-06
【Leetcode Daily】1208尽可能使字符串相等
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个字符串,和一个整数变量,求一个最长字符串的长度,使得一个字符串变换为另一个(ASCII码差值),变换的总值在那个整数之内。 思路分享 典型的不定长滑动窗口(【Leetcode Daily】3090每个字符最多出现两次的最长字符串,无需多盐 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 123456789101112131415161718class Solution {public: int equalSubstring(string s, string t, int maxCost) { int curCost = 0; int left = 0; int n = t.size(); int ans = 0; for (int i = 0; i < n; i++) { curCost += abs(s[i]-t[i]); if (curCost...

2025-05-30
【Leetcode Daily】1248统计优美子数组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组和一个整数 k,要求其中所有子数组的数量,不过子数组需要满足一个条件,即其中的奇数的个数恰好为 k。 思路分享 和【Leetcode Daily】930和相同的二元子数组类似的恰好型不定长滑动窗口,不过本题让陆爻齐更深入的思考,越长越合法的左指针的意义。 “众”所周知,我们灵神派的越长越合法类型的解法,是通过累计窗口左指针数值之和计算得出,其意义,除了充当窗口的左侧边界,实质意义可以理解为,窗口左侧满足条件的情况数目,而窗口本身是在遍历右指针情况,这样一来就算是统计了所有情况。 拿第一次满足条件的窗口举例,此时,窗口的左侧还在起点,下标为 0,示意着此前没有满足条件的情况,进入中间的循环,循环的作用是找出不满足条件的边界;如果第一个元素(下标为 0 的那个)恰好是窗口需要的元素,那么左指针右移一步后,因窗口不符合条件而终止循环,此时左指针下标为...

2025-05-19
【Leetcode Daily】1358包含所有三种字符的子字符串数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串,由 a b c 组成,找出其中所有至少包含a b c各一个的子字符串。 思路分享 不定长滑动窗口变式,变在“至少”,也就是说,一旦找到一个合适的窗口,就是一个合适的窗口右端点,窗口左侧一直往左都是答案,所以最终计算答案时,直接看包含 a b c 至少各一个的最短窗口的左端数值之和。 不过具体判断窗口是否满足条件,除了直接计算对三个字母的记录是否都非零外,也可以引入另一个变量统计当前字母为零的个数,看起来更快,但实际上差别不大,复杂度都是O(1)。 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061class Solution {public: int numberOfSubstrings(string s) { int...

2025-05-05
【Leetcode Daily】1493删掉一个元素以后全为1的最长子数组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个由 0 和 1 组成的数组,现在需要从中删除一个元素,求删除后只含 1 的最长子数组长度。 思路分享 除了不定长滑动窗口模板的内容(【Leetcode Daily】3090每个字符最多出现两次的最长字符串),本题只有一点需要特别注意,那就是必须要删除一个字符的需求。 由于这个需求的存在,会造成一种情况,如果子串内没有 0,也必须删除一个字符,而如果子串内有一个 0,那就删除 0 来获取长度。所以可以发现,无论是什么情况,最后求得的结果都要减一。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 12345678910111213141516171819202122class Solution {public: int longestSubarray(vector<int>& nums) { int zero_count = 0; int left = 0; int n = nums.size(); int...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
