思路对了,但是不会写。
等差数列长度不是1就是2,所以不是一个字母就是俩字母,一开始写的时候直接枚举两个字母,然后让次数相乘。这样是不对的,比如abaabb,字母ab的个数应该是3+2+2,因该是每一个a后边b的个数然后相加。
正解:维护一个二位数组dp[i][j],表示位置后边,字符j的个数,然后枚举两个字符k和j,当位置i是字符k时,直接相加,当长度为1时,答案为x*(x-1)/2
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N=1E5+7; ll dp[N][30]; ll mp[30]; ll arr[30]; int main(){ string s; cin>>s; ll n=s.size(); ll ans=0; for(ll i=0;i<n;i++) { mp[s[i]-'a']++; ans=max(ans,mp[s[i]-'a']); } ans=max(ans,(ans-1)*ans/2); for(ll i=0;i<n;i++){ arr[s[i]-'a']++; for(ll j=0;j<26;j++){ dp[i][j]=mp[j]-arr[j]; } } for(ll i=0;i<26;i++){ for(ll j=0;j<26;j++){ if(i==j) continue; ll tmp=0; for(ll k=0;k<n;k++){ if(s[k]==i+'a'){ tmp+=dp[k][j]; } } ans=max(ans,tmp); } } cout<<ans<<endl; return 0; }