在二进制字符串中,翻转一对相邻位可以轻松地从字符串中删除单个 0。然而,当我们需要从二进制字符串中删除所有 0 时,我们可能还需要翻转不相邻的位对。在本文中,我们将讨论如何确定从二进制字符串中删除所有 0 所需的非相邻对翻转的最小次数。
为了解决这个问题,我们将使用一个简单的贪心算法。这个想法是始终选择彼此相距最远并且之间至少有一个 0 的一对位。然后我们可以翻转这两位,有效地从字符串中删除一个 0。我们重复这个过程,直到所有的 0 都被删除。
现在让我们用 C++ 实现这个算法。
#include <iostream> #include <cstring> using namespace std; int main() { string s; s="100101000"; int n = s.size(); int cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') { cnt++; if (i+2 < n && s[i+2] == '0') { i += 2; } else { i++; } } } cout << cnt << endl; return 0; }
3
上面的代码采用二进制字符串作为输入,并计算从字符串中删除所有 0 所需的非相邻对翻转的最小次数。现在让我们详细了解代码。
首先,我们将二进制字符串作为输入并将其存储在字符串变量“s”中。我们还将字符串的大小存储在整数变量“n”中。
string s; cin >> s; int n = s.size();
接下来,我们初始化变量“cnt”来存储字符串中 0 的数量。然后我们使用 for 循环迭代该字符串。对于遇到的每个 0,我们都会增加 0 的计数并检查接下来的两位是否也是 0。如果是,我们通过将索引增加 2 来翻转这对位。否则,我们通过将索引增加 1 来仅翻转相邻的位对。
int cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') { cnt++; if (i+2 < n && s[i+2] == '0') { i += 2; } else { i++; } } }
最后,我们输出从字符串中删除所有 0 所需的非相邻对翻转的计数。
cout << cnt << endl;
让我们考虑二进制字符串“100101000”。可以使用上述算法计算从该字符串中删除所有 0 所需的非相邻对翻转的最小次数。
首先,我们在位置 2 处遇到 0。我们翻转 (1,3) 对以得到字符串“110101000”。然后我们在位置 5 处遇到下一个 0。我们翻转 (1,7) 对以得到字符串“111101000”。然后我们在位置 8 处遇到下一个 0。我们翻转 (1,9) 对以得到字符串“111111000”。现在所有 0 都已从字符串中删除。
从字符串中删除所有 0 所需的非相邻对翻转次数为 3。我们可以通过对输入字符串“100101000”运行上述 C++ 代码来验证这一点。
在本文中,我们讨论了如何确定从二进制字符串中删除所有 0 所需的非相邻对翻转的最小次数。我们使用简单的贪心算法来解决这个问题,并用C++代码实现。我们还提供了一个示例测试用例来说明算法的工作原理。
以上是移除二进制字符串中所有的0所需的最小非相邻对翻转次数的详细内容。更多信息请关注PHP中文网其他相关文章!