用c++编译程序,给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。 选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。 返回使字符串内所有字符 相等 需要的 最小成本 。 反转 字符意味着:如果原来的值是 '0' ,则反转后值变为 '1' ,反之亦然
时间: 2024-02-13 07:05:11 浏览: 66
这道题可以使用贪心算法解决。考虑将整个字符串变成全0或全1,那么我们需要统计出每个位置变成0或1的代价。假设我们要将字符串变成全0,那么对于位置i,它变成0的代价为i+1,变成1的代价为n-i。同样的,如果我们要将字符串变成全1,那么对于位置i,它变成1的代价为i+1,变成0的代价为n-i。
我们可以通过比较这两个代价,选择更小的那个进行翻转。具体来说,我们从左往右遍历每个位置,统计变成0或1的代价,并记录当前的最小代价。然后再从右往左遍历每个位置,统计变成0或1的代价,并记录当前的最小代价。最后比较两个方向的最小代价,选择更小的那个进行翻转,直到整个字符串变成全0或全1。
以下是C++代码实现:
```c++
int minCost(string s) {
int n = s.size();
int cost0 = 0, cost1 = 0;
int res = INT_MAX;
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
cost0 += i + 1;
} else {
cost1 += i + 1;
}
}
res = min(cost0, cost1);
int cur0 = cost0, cur1 = cost1;
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '0') {
cur0 += n - i;
cur1 -= n - i;
} else {
cur1 += n - i;
cur0 -= n - i;
}
res = min(res, min(cur0, cur1));
}
return res;
}
```
时间复杂度:O(n)
阅读全文