题目:3144. 分割字符频率相等的最少子字符串
思路:本题一定有答案,n个平衡子字符串,即将字符串分割成长度为1的子字符串。但我们需要最少数量。
采用动态规划,区间[0,i]的最少平衡子字符串的数量可以由区间[0,j]的数量,以及j+1~i这个平衡子字符串组成。细节看注释
class Solution {
public:
int minimumSubstringsInPartition(string s) {
s=" "+s;
int n=s.size();
vector<int> f(n,INT_MAX);
f[0]=0;
for(int i=1;i<n;i++){
//用于记录区间[j,i]之间字符出现的数量
vector<int> ct(26,0);
//用于记录区间[j,i]之间字符出现的种数
int k=0;
//用于记录区间[j,i]之间字符出现的最大数量
int mx=0;
for(int j=i;j>0;j--){
ct[s[j]-'a']++;
if(ct[s[j]-'a']==1) k++;
mx=max(mx,ct[s[j]-'a']);
//j+1~i这个区间是平衡子字符串
if(i-j+1==k*mx){
f[i]=min(f[i],f[j-1]+1);
}
}
}
return f[n-1];
}
};