华为机试,HJ127 小红的双生串
小红的双生串
https://www.nowcoder.com/practice/099d6681234d4e3e95c0e0ade31929da?tpId=37&tqId=43265&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D3%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
(改一下题目,双生串不限制只在中间位置分开,两边颜色各自统一,可以在任何位置分开)
可以用前缀和,时间复杂度:O(26*n) ,空间复杂度:O(26*n)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+6;
int qsum[28][N],sum[28];
string s;
int main(){
cin>>s;
for(int i=0;i<s.size();i++){
sum[s[i]-'a']++;
for(int j=0;j<26;j++){
if(s[i]-'a'==j) qsum[j][i+1]=qsum[j][i]+1;
else qsum[j][i+1]=qsum[j][i];
}
}
// for(int i=0;i<26;i++){
// cout<<sum[i]<<" ";
// }
// cout<<endl;
int ans=N;
for(int i=0;i<s.size();i++){
int mal=0,mar=0;
for(int j=0;j<26;j++){
mal=max(mal,qsum[j][i+1]);
mar=max(mar,sum[j]-qsum[j][i+1]);
}
// cout<<mal<<" "<<mar<<endl;
int x=s.size()-mal-mar;
ans=min(ans,x);
}
cout<<ans;
return 0;
}
}

