首页 > 其他分享 >1234. 替换子串得到平衡字符串

1234. 替换子串得到平衡字符串

时间:2023-04-07 21:12:41浏览次数:53  
标签:1234 子串 cnt right int ++ 字符串 left

题目链接:1234. 替换子串得到平衡字符串

方法:同向双指针

解题思路

  • 若可以通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」,则说明子串外任意字符的数量 \(s ≤ n / 4\),否则一旦有一个字符的数量大于 \(n / 4\),那么不论如何替换,必定有另一个字符的数量小于 \(n / 4\),无法达到平衡。

  • 可以通过同向双指针,初始化 \(left = 0,right = 0\),枚举右指针 \(right ++\),当 \([left, right]\) 子串外满足字符数量均小于 \(n / 4\),则可以替换该子串以达到平衡,此时开始枚举左指针 $left ++ $,若新子串满足上述要求,则同样可以替换该子串。遇到可以替换的子串时,取子串数量最小的更新 \(ans\)。

  • \(right\) 单调增加不会漏掉答案的保证:若 \([left, right]\) 子串不满足要求,那么 \([left + 1, right], [left + 2, right],...\)子串一定不满足,因为 \([left, right]\) 不满足说明子串外一定有某一字符的数量大于 \(n / 4\),如果此时再 \(left ++\) ,那么只会使得子串外的字符数量增加,更不会符合条件。因此只有先枚举 \(right\) 指针使得 \([left, right]\) 子串满足要求之后,再枚举 \(left\) 指针来缩短子串长度。

代码

class Solution {
public:
    int balancedString(string s) {
        int n = s.size(), m = n >> 2;
        int cnt['Z']{};
        for (char &ch : s) cnt[ch] ++ ;
        if (cnt['Q'] == m && cnt['W'] == m && cnt['E'] == m && cnt['R'] == m) return 0;
        int ans = n; // INF
        for (int right = 0, left = 0; right < n; right ++ ) {
            cnt[s[right]] -- ;
            while (cnt['Q'] <= m && cnt['W'] <= m && cnt['E'] <= m && cnt['R'] <= m) {
                ans = min(ans, right - left + 1);
                cnt[s[left]] ++ ; left ++ ;
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)。

相同类型题目

713. 乘积小于 K 的子数组

// 参考
class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        if (k <= 1) return 0;
        int ans = 0, prod = 1;
        for (int left = 0, right = 0; right < nums.size(); right ++ ) {
            prod *= nums[right];
            while (prod >= k) 
                prod /= nums[left ++ ];  
            ans += right - left + 1;
        }
        return ans;
    }
};

209. 长度最小的子数组

// 参考
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int left = 0, sum = 0, ans = n + 1;
        for (int right = 0; right < n; right ++ ) {
            sum += nums[right];
            while (sum >= target) {
                ans = min(ans, right - left + 1);
                sum -= nums[left ++ ];
            }
        }
        return ans <= n ? ans : 0;
    }
};

标签:1234,子串,cnt,right,int,++,字符串,left
From: https://www.cnblogs.com/lxycoding/p/17297331.html

相关文章

  • JS 字符串特殊字符全部替换空
    1、方法constformatStr=(str)=>{constvalue=str.replace(/[`:_~!@#$%^&*()\+=<>?"{}|,\/;'\\[\]·~!@#¥%……&*()——\+={}|《》?:“”【】、;‘’,。、-]/g,'',)returnvalue}2、实例......
  • 题目 1031: [编程入门]自定义函数之字符串反转
    在主函数中输入一个字符串(不包含空格),写一个新函数将字符串按反序存放,并在主函数中输出反序后的字符串gets()能把字符串写入数组里,我只需要再写一个新数组,把array数组的最后一个元素赋值给新数组的第一个元素,把array的倒数第二个赋值给新数组的第二个……这样一个一个赋值,万一阿......
  • 关于一些OJ上的\r以及\n以及字符串行输入的一些警示
    \r,\n,\r\n的区别-小天-博客园(cnblogs.com)这篇文章详细的解释了在Windows系统和Linux系统下的换行的区别概括的说,就是Windows系统下的“\r\n”等于Linux系统下的’\n‘因此在一些搭建在Linux终端上的Oj,我们输入时的回车是在WIndows系统中的输入,OJ在评判输出的时候会在L......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • 如何使用awk进行字符串大小写的转换?
    1、问题:如何将下面的这个字符串,全部转换为  大写  ?DOMaiN,verify,reference,offset,LIMIT,TYPE,ref,context,LOGIN,CONTEXT,sa  使用awk的toupper()函数来实现[root@yks01~]#echo"DOMAIN,verify,reference,offset,LIMIT,TYPE,ref,context,LOGIN,CONTEXT,sa"......
  • 无重复字符的最长子串
    题目描述难度中等给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度为1......
  • 算法题-第K个小子串
    第K小子串输入一个字符串s,s由小写英文字母组成,保证s长度小于等于5000并且大于等于1。在s的所有不同的子串中,输出字典序第k小的字符串。字符串中任意个连续的字符组成的子序列称为该字符串的子串。字母序表示英文单词在字典中的先后顺序,即先比较第一个字母,若第一个字......
  • 字符串学习笔记(一)
    一些定义:1.Border:如果一个字符串的某个前缀同与它长度相同的后缀完全相同,就称这个前缀(后缀)是这个字符串的一个Border.2.周期:如果一个字符串s满足对于任意的p<i\(\leqslant\)|s|,s[i]=s[i-p],则称p是字符串s的周期,一个字符串可能有很多个周期。3.循环节:在周期的......
  • c++字符串拆分
    1staticvoidSplitString(conststring&data,conststring&delim,2std::vector<string>*result){3std::string::size_typepos;4constintsize=data.size();56for(intindex=0;index<size;++index)......
  • WPF的控件字符串内容使用StringFormat进行字符串转换
    在WPF中TextBlock的Text有时内容只需要改变个别数字,而不需要所以内容都修改,这时候就要使用StringFormat, 如:<TextBlockText="Ihavexxxfriends"/>这里面的xxx是个变量,那在Binding时应该怎样写呢<TextBlockText="{BindingFirendNumber,StringFormat='Ihave{0}firends......