给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。 选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。 返回使字符串内所有字符 相等 需要的 最小成本 。
时间: 2024-02-13 13:05:17 浏览: 177
将字符串反转
首先,如果字符串中有不止一种字符,则无法将所有字符变为相等的,因此最小成本为-1。
接下来,我们只考虑字符串中只有一种字符的情况。因为我们只能通过反转来改变字符串,因此我们可以首先计算出反转所有前缀或后缀所需的成本,然后选择最小的那个。例如,假设字符串是00000,我们可以计算出反转前缀的成本分别为1、2、3、4、5,反转后缀的成本分别为5、4、3、2、1,因此我们选择反转前缀的成本最小,即1。
代码如下:
```python
def minCost(s: str) -> int:
n = len(s)
if len(set(s)) > 1:
return -1
cost = [0] * (n + 1)
for i in range(1, n + 1):
if s[i-1] == '0':
cost[i] = cost[i-1] + i
else:
cost[i] = cost[i-1]
min_cost = float('inf')
for i in range(n+1):
min_cost = min(min_cost, cost[i] + (n-i)*(n-i+1)//2 - (cost[n]-cost[i]))
return min_cost
```
其中,cost数组记录了反转前缀所需的成本,min_cost记录了反转前缀和反转后缀所需的最小成本。时间复杂度为O(n)。
阅读全文