解题思路
(1)双重for循环会超时。
(2)一个字符只有第一次出现时是有贡献的,记录a-z每一个字符上次在字符串中出现的位置,以此判断当前字符距离上一次出现中间多少字符,计算该字符作为第一次出现的子串数,它对这些子串都是有贡献的(即作为不同的字符出现)。
(4)关于子串数量计算公式,可以自己写一个字符串看一下,向前多少子串,向后多少子串,很容易看出来的。
(3)注意要用long long。
C++ 代码
#include <iostream>
#include <math.h>
#include<string>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
long long chara[27]={0};
memset(chara,0,sizeof(chara));
string str;
cin>>str;
long long ans=0;
long long n=str.length();
for(long long i=0;i<n;i++){
char temp=str[i];
long long index=int(temp)-96;
ans+=(i-chara[index]+1)*(n-i);
chara[index]=i+1;
}
cout<<ans<<endl;
}