n = int(input()) s = input() #回溯 # result = [] # path = [] # def back(s): # if len(path) == 3 and path[0]!=path[1] and path[1] == path[2]: # # print(path) # result.append(path.copy()) # return # if len(path)>=3: # return # for i in range(len(s)): # if path == [] or path[0] != s[i]: # path.append(s[i]) # back(s[i+1:]) # path.pop() # back(s) # print(len(result)) #数学方法 D = {} for i in s: if i not in D: D[i] = 1 else: D[i] += 1 result = 0 for i in range(len(s)): D[s[i]] -= 1 #扫描一个,向后走一个,把走过的在字典中减一 for j in D: if j!=s[i]: #确保后面的和第一个是不同的字母 result += (D[j] * (D[j] -1) ) //2 print(result)
回溯法过了8/11,效率较低
数学用后缀和的方式进行,全部通过