给定一串桶(字母)。找出将所有水桶带到底部的成本(可能是最小的)

Given a String of Buckets (alphabets). Find the cost (possibly minimal) to bring all the buckets at the base

Bob 是一名建筑工人,他通过数学来提高效率。他在一个工地上工作,有 n 桶水泥,上面标有不同的字符 (a - z)。他有学长的严格命令,不能改变桶的顺序。

在开始他的工作之前,他得到了一个长度为 n 的字符串 s,其中位置 [=38= 的字符]i (1 <= i <= n) 给我们第 i'th 个桶上的标记。他一次只能提一个水桶,带回基地。在每一轮中,他都有一个关于拿起哪个桶的标准。他将拿取标有最小字符 (a

约束条件

1 < t,m < 10^5

所有测试用例n的总和不超过10^6

样本输入

2
badce

样本输出

7

说明

总成本变为 7 个单位。

我尝试在 Python 中编写代码,但在某些情况下给出 TLE。 这是我的方法-->

n = int(input())
s = input()
count_array = [0] * 26
for i in range(n):
    count_array[ord(s[i])-97] += 1

alphabets = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    
ans = 0

for i in range(26):
    while count_array[i] > 0:
       idx = s.index(alphabets[i])
       ans += idx + 1
       if idx > -1: s = s[0:idx] + s[idx+1:]
       count_array[i] -= 1
    
print(ans)

我正在寻找一种采用 O(nlogn)O(n) 时间复杂度的优化方法。谢谢。

这在 O(n) 中运行。对于每个字符,检查后面将传输多少个先前的字符。

def get_cost(s):
    result = 0
    seen = [0] * 26
    for c in s:
        idx = ord(c) - ord('a')
        result += 1 + sum(seen[idx+1:])
        seen[idx] += 1
    return result