1.思路(算法:1维的类DP...)
核心逻辑:逆向统计三元组贡献
----题目要求统计满足 i<j<ki<j<ki<j<k 且 Si=SkS_i=S_kSi =Sk 的三元组数量,等价于对每个字符作为三元组的第三个元素(位置 k ),统计之前能与之配对的第一个元素(位置 i )的数量,再乘以中间可插入的第二个元素(位置 j )的数量。
算法步骤
* 状态定义:
c[j]:记录当前字符之前,第j个字母的出现次数
a[j]:记录当前字符之前,以第j个字母为开头的合法三元组数量(即所有满足 i<j<当前位置i<j<当前位置i<j<当前位置 且 Si=第j个字母S_i=第j个字母Si =第j个字母 的三元组数量)
* 动态更新:
遍历字符串时,将当前字符作为三元组的第三个元素,累加之前能形成的合法三元组数量到 ans
更新所有字母的三元组计数:每个字母的三元组数量 += 该字母的出现次数
增加当前字母的出现次数
* 时间复杂度:O(∣S∣)O(|S|)O(∣S∣)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.参考代码