力扣1234. 替换子串得到平衡字符串
这一题的大意是说给出一个只含有特定字符的字符串,现在要求我们找到各个字符都处于平衡的状态,即每一个字符出现的次数都是k,
我们可以选择通过用一个替换一个子字符串来改变各个字符出现的次数,使它们处于平衡状态。我们希望这个子字串尽可能的小。
现在让我们找到通过替换子串使得字符串平衡的最小的子串的长度。
那么我们就要想,什么样的子字符串可以被替代,什么情况下,该子字符串可以被替换,使得各个字符处于平衡状态。
当在子字符串以外各个字符出现的次数是小于等于k的时候,该子字符串是符合条件的,可以用来更新ans。
为啥这种情况下,是符合条件的呢?
因为子字符串会将缺少的不足的字符补齐,而如果在子字符串之外有超过的,那么完整的字符串是一定不平衡的,因为字符总数是固定的,一种字符超出k,那么必定会有另一种字符不足,因此我们可以采用滑动窗口的方式寻找子字符串,在滑动的过程中保证所有字符是小于等于k即可。如果超出k就应该扩大窗口,使得字符的数量减少。为了使得子字符串尽可能的小,我们会移动l,使得各个字符的数量变大,在滑动的过程中找到最小的子串。
完整代码如下:
class Solution {
public:int balancedString(string s) {int n=s.size();int per=n/4;unordered_map<char,int> mp;for(int i=0;i<s.size();i++){mp[s[i]]++;}if(mp['W']==per&&mp['Q']==per&&mp['E']==per&&mp['R']==per){return 0;}int l=0;int r=0;int ans=INT_MAX;while(r<n){mp[s[r]]--;while(mp['W']<=per&&mp['Q']<=per&&mp['E']<=per&&mp['R']<=per){ans=min(ans,r-l+1);mp[s[l]]++;l++;}r++;}return ans;}
};
时间复杂度O(n)