卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章17280本站已运行3326

移除二进制字符串中所有的0所需的最小非相邻对翻转次数

移除二进制字符串中所有的0所需的最小非相邻对翻转次数

在二进制字符串中,翻转一对相邻位可以轻松地从字符串中删除单个 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++代码实现。我们还提供了一个示例测试用例来说明算法的工作原理。

卓越飞翔博客
上一篇: typedef的用法是什么
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏