C++ 中从给定二进制字符串子串中最大化可删除的少数字符


我们当前的任务涉及最大化我们可以删除任何包含少数字符的出现的次数,这些出现位于完全由“0”或“1”组成的部分中。最终目标只是在仍然遵守所有给定规则和约束的情况下,达到最大可能的删除次数。

语法

为了全面理解即将到来的代码,让我们首先熟悉将在探索算法和策略之前采用的方法的语法 -

int maximizeDeletions(string binaryString, int startIndex, int endIndex)

算法

从给定二进制字符串子串中最大化少数字符删除的算法可以用以下步骤描述 -

  • 首先,让我们开始初始化一个名为删除的变量为零。此变量的主要目的是监控发生的删除次数。

  • 要确定数字“0”和“1”在二进制字符串的特定子串中出现的频率。可以分别计算这些数字的每个出现次数。

  • 为了查明少数字符,我们必须参考上一步中获得的计数。

  • 从子字符串中删除少数字符的所有出现次数,并相应地更新删除计数。

  • 将删除的最终值作为结果返回

方法 1:遍历方法

我们方法的执行涉及以线性方式遍历二进制字符串子串,然后一次性删除少数字符。

示例

#include <iostream>
#include <algorithm>
using namespace std;

int maximizeDeletionsLinear(string binaryString, int startIndex, int endIndex) {
   int countZero = 0;
   int countOne = 0;

   for (int i = startIndex; i <= endIndex; i++) {
      if (binaryString[i] == '0') {
         countZero++;
      } else {
         countOne++;
      }
   }

   int deletions = endIndex - startIndex + 1 - min(countZero, countOne);
   return deletions;
}

int main() {
   string binaryString;
   int startIndex, endIndex;

   cout << "Enter the binary string: ";
   cin >> binaryString;
   cout << "Enter the start index: ";
   cin >> startIndex;
   cout << "Enter the end index: ";
   cin >> endIndex;

   int deletions = maximizeDeletionsLinear(binaryString, startIndex, endIndex);
   cout << "Maximum deletions: " << deletions << endl;
   
   return 0;
}

输出

Enter the binary string: 1011010011
Enter the start index: 2
Enter the end index: 8
Maximum deletions: 2

解释

在方法 1 中,我们利用线性遍历来最大化从给定二进制字符串子串中删除少数字符的次数。通过遍历指定的子串,我们可以识别“0”和“1”在该部分中出现的次数。在查明哪个字符在该区域或组内出现频率较低(即,找到“少数”)之后,我们可以通过从该指定区域内所有字符的总数中减去其各自的计数来计算可能的删除次数。

这导致了一种有效的方法,它揭示了简单而实用的解决方案 - 只需要对我们的初始字符串进行一次遍历 - 使得这种方法特别适合较短的输入字符串。

方法 2:滑动窗口

滑动窗口技术是解决此问题的另一种有效方法。它涉及使用固定大小的窗口遍历二进制字符串的子串

示例

#include <iostream>
#include <algorithm>
using namespace std;

int maximizeDeletionsSlidingWindow(string binaryString, int startIndex, int endIndex) {
   int left = startIndex;
   int right = startIndex;
   int countZero = 0;
   int countOne = 0;
   int deletions = 0;

   while (right <= endIndex) {
      if (binaryString[right] == '0') {
         countZero++;
      } else {
         countOne++;
      }

      while (min(countZero, countOne) > 0) {
         if (binaryString[left] == '0') {
            countZero--;
         } else {
            countOne--;
         }
         left++;
      }

      deletions = max(deletions, right - left + 1);
      right++;
   }

   return deletions;
}

int main() {
   string binaryString;
   int startIndex, endIndex;

   cout << "Enter the binary string: ";
   cin >> binaryString;
   cout << "Enter the start index: ";
   cin >> startIndex;
   cout << "Enter the end index: ";
   cin >> endIndex;

   int deletions = maximizeDeletionsSlidingWindow(binaryString, startIndex, endIndex);
   cout << "Maximum deletions: " << deletions << endl;

   return 0;
}

输出

Enter the binary string: Enter the start index: Enter the end index: Maximum deletions: 0

解释

方法 2 涉及利用滑动窗口技术来最大化少数字符的删除次数。使用固定大小的窗口,我们遍历子字符串,并在移动窗口时更新“0”和“1”的计数。通过根据计数调整窗口边界,我们识别少数字符并计算最大可能的删除次数。这种方法通过有效地滑动窗口减少了冗余计算的数量,使其更适合较大的输入并提供更快的解决方案。

结论

在本文中,我们探讨了从给定二进制字符串子串中最大化少数字符删除的问题。我们讨论了两种方法 - 线性遍历和滑动窗口技术。这两种方法都提供了有效的解决方案来实现预期的结果。通过理解算法并研究提供的可执行代码示例,您可以将这些概念应用于解决您自己项目中的类似问题。请记住分析问题,选择最合适的方法,并相应地实施。

更新于: 2023-07-25

72 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告