给你一个长度为 n 、下标从 0 开始的二进制字符串 target 。你自己有另一个长度为 n 的二进制字符串 s ,最初每一位上都是 0 。你想要让 s 和 target 相等。 在一步操作,你可以选择下标 i(0 <= i < n)并翻转在 闭区间 [i, n - 1] 内的所有位。翻转意味着 '0' 变为 '1' ,而 '1' 变为 '0' 。 返回使 s 与 target 相等需要的最少翻转次数。
时间: 2024-02-25 21:53:23 浏览: 119
好的,这是一个比较简单的题目。我们可以从字符串的最后一位开始,逐位比较 target 和 s 中对应位的值。如果不相等,我们就需要进行翻转操作,将 s 中对应位及之后的所有位都翻转一次。具体实现可以参考下面的代码:
```
int minFlips(string target) {
int n = target.size();
int cnt = 0;
char cur = '0';
for(int i = n - 1; i >= 0; i--) {
if(target[i] != cur) {
cnt++;
cur = cur == '0' ? '1' : '0';
}
}
return cnt;
}
```
我们从字符串的最后一位开始,对于每一位,如果它和当前的 cur 不相等,就需要进行翻转操作,并将 cur 取反。最后统计翻转的次数即可。
希望能够帮到你!
相关问题
给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。 选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。 返回使字符串内所有字符 相等 需要的 最小成本 。 反转 字符意味着:如果原来的值是 '0' ,则反转后值变为 '1' ,反之亦然。 c++ 实现
以下是该题目的 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)。
阅读全文