给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。 选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。 返回使字符串内所有字符 相等 需要的 最小成本 。 反转 字符意味着:如果原来的值是 '0' ,则反转后值变为 '1' ,反之亦然。 c++ 实现
时间: 2024-02-13 15:05:16 浏览: 43
以下是该题目的 C++ 实现代码:
```c++
int minCost(string s) {
int n = s.size();
int cnt[2] = {0}; // 统计 0 和 1 出现的次数
for (char c : s) {
cnt[c - '0']++;
}
if (cnt[0] == n || cnt[1] == n) { // 特判:如果字符串中只有一种字符,不需要操作
return 0;
}
int target = cnt[0] > cnt[1] ? 0 : 1; // 找到出现次数最多的字符作为目标字符
int cost = 0;
int cur = 0;
for (int i = 0; i < n; i++) {
if (s[i] - '0' == target) { // 当前字符是目标字符
if (target == 0 && s[i] == '1' || target == 1 && s[i] == '0') { // 如果当前字符是目标字符的反转字符
cost += i + 1 < n - i ? i + 1 : n - i; // 反转前缀或后缀,取最小值
}
cur++; // 统计当前字符数
} else { // 当前字符不是目标字符
if (target == 0 && s[i] == '0' || target == 1 && s[i] == '1') { // 如果当前字符和目标字符的反转字符相同
cost += i + 1 < n - i ? i + 1 : n - i; // 反转前缀或后缀,取最小值
cur++; // 统计当前字符数
}
}
}
if (cur == 0) { // 特判:如果字符串中没有目标字符,返回 0
return 0;
}
cost += (cur - 1) * cur / 2; // 计算将所有字符转换成目标字符所需的最小成本
return cost;
}
```
该算法的时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文