1234.替换字串得到平衡字符串
如果在待替换子串之外的任意字符的出现次数都不超过 n/4,那么可以通过替换,使 s 为平衡字符串,即每个字符的出现次数均为 n/4。
遍历字符串(利用ASCII码表)
for(char c:s) cnt[c]++;
if(cnt['Q']==m && cnt['W']==m && cnt['E']==m && cnt['R']==m) return 0;
class Solution {
public:
int balancedString(string s) {
int n=s.length(),m=n/4,ans=n,head=0;
int cnt['X']{};
for(char c:s) cnt[c]++;
if(cnt['Q']==m && cnt['W']==m && cnt['E']==m && cnt['R']==m) return 0;
for(int i=0;i<n;i++){
cnt[s[i]]--;
while(cnt['Q']<=m &&cnt['W']<=m &&cnt['E']<=m &&cnt['R']<=m){
ans=min(ans,i-head+1);
cnt[s[head]]++; //待替换子串之外的字符数
head++;
}
}
return ans;
}
};
2875.无限数组的最短子数组
long long total=accumulate(nums.begin(),nums.end(),0LL); //nums数组的元素和
注意accumulate()函数的数据类型,LL
后缀用来确保这个数字被解释为long long
类型。
class Solution {
public:
int minSizeSubarray(vector<int>& nums, int target) {
int n=nums.size(),ans=INT_MAX,head=0,diff=0;
long long sum=0;
long long total=accumulate(nums.begin(),nums.end(),0LL); //nums数组的元素和
for(int i=0;i<2*n;i++){
sum+=nums[i%n];
while(sum>target%total){
sum-=nums[head%n];
head++;
}
if(sum==target%total) {
diff++;
ans=min(ans,i-head+1);
}
}
if(diff==0) return -1;
else return ans+target/total*n;
}
};