n = int(input()) s = input() # 把三元组 (i, j, k) 拆成 # “左边有多少跟 j 不同的字符” × “右边有多少跟 j 相同的字符”, # 然后对所有位置 j 累加即可。 count=[0]*26 dp=[0]*26 res=0 for i in range(len(s)): c=ord(s[i])-97 #97转到0 res+= dp[c] #c作为k来考虑的 dp[c]+=i-count[c] #c作为j来考虑,统计在j之前有多少个和c不同的字符 #注意要用+=,因为后面遇到 c 作为 k 的时候,前面出现的每个 c 都可以作为 j count[c]+=1 #没什么坏心眼,统计的就是从左到右扫描到 i 的时候,c 出现的次数 print(res)
乘法原理,考虑 j 之前和 s[j]不同的字符数,和 j 之后和 s[j]相同的字符数
从左到右进行扫描,得到 dp[c]