简单易懂思路:用abb中第一个出现的b来考虑,一个字符作为第一b能产生的abb字符,等于它后面相同的字符数量(意味着还能凑成多少个bb)乘以它前面与它不相同的字符数量(可以被当作a的)。于是先记录每一个字符总出现的次数。然后再遍历字符串记录每个字符已经出现的次数和后面还没出现的次数。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main(){
int n;cin>>n;
string str;cin>>str;
unordered_map<char,int> mp1;//记录此字符还有多少个
unordered_map<char,int> mp2;//记录此字符已经出现了多少个
for(char c:str){
mp1[c]++;//先记录总的字符数
}
long res = 0;
for(int i = 0;i<n;i++){
char c = str[i];
mp1[c]--;//遇到的字符则还有的数量-1
mp2[c]++;
if(mp1[c]>0) res+= (i+1-mp2[c]) * mp1[c];//(i+1-mp2[c])得到a的数量,mp1[c]是可能的bb数量
}
cout<<res<<endl;
return 0;
}