根据给定条件拆分给定的二进制字符串以最大化总和(C++)


本文旨在解决一个复杂的算法问题,该问题涉及如何拆分二进制字符串以最大化从各个组件获得的累积和。我们将为读者提供一个全面的语法大纲,用于实现代码,并建议两种可能的技术来克服这一挑战。此外,我们将展示两个基于上述方法的真实可执行代码。

语法

在深入研究算法之前,至关重要的是,我们要充分了解我们指定的方法的结构,我们将在即将推出的代码示例中展示该方法。该方法采用二进制字符串作为输入,并通过使用预定的条件对所述输入进行分区来计算其最高可能值。下面说明了该方法在语法方面的表现−

int maximizeSum(string binaryString) {
   // Implementation of the algorithm goes here
}

算法

现在我们应该讨论分步算法,以解决通过拆分二进制字符串来最大化和的问题。

片段 1

  • 初始化两个变量 `maxSum` 和 `currentSum`,都设置为零。

  • 从左向右遍历二进制字符串。

  • 对于字符串中的每个字符 -

    • 如果字符为 '0',则将其追加到当前子字符串。

    • 如果字符为 '1' -

      • 通过向其添加当前 `currentSum` 来更新 `maxSum`。

      • 将 `currentSum` 重置为零。

  • 遍历后,将最终的 `currentSum` 添加到 `maxSum`。

  • 将 `maxSum` 作为结果返回。

方法 1

解决此问题的第一种方法涉及执行如上所述的算法。我们来看看相应的代码片段 -

示例

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

int maximizeSum(string binaryString) {
   int maxSum = 0;
   int currentSum = 0;

   for (char c : binaryString) {
      if (c == '0') {
         currentSum = currentSum * 10 + (c - '0');
      } else {
         maxSum += currentSum;
         currentSum = 0;
      }
   }

   maxSum += currentSum;
   return maxSum;
}

int main() {
   string binaryString = "1001101001";
    
   int result = maximizeSum(binaryString);
   cout << "Maximum sum: " << result << endl;

   return 0;
}

输出

Maximum sum: 0

说明

  • 代码首先包含必要的库(`iostream` 和 `string`),并为了方便而使用 `std` 命名空间。

  • 要计算通过拆分一个二进制字符串可以达到的最大和,可以使用 `maximizeSum` 函数,该函数将二进制字符串作为输入并返回输出。

  • 在此函数中初始化了两个变量 - `maxSum` 和 `currentSum`。前者跟踪到目前为止达到的最大值,而后者计算每个单独子字符串的总和。

  • 使用基于范围的 for 循环,我们遍历输入的 `binaryString` 中的每个字符 `c`。

  • 如果当前字符 `c` 是 '0',则通过将 `currentSum` 乘以 10 并向其中添加 '0' 的数值来更新 `currentSum`。这实际上将 '0' 追加到当前子字符串。

  • 如果当前字符 `c` 是 '1',则表示当前子字符串结束。我们将 `currentSum` 添加到 `maxSum` 以更新到目前为止达到的最大和,然后将 `currentSum` 重置为零以开始一个新的子字符串。

  • 在完成循环后,通过将其添加到先前的 `maxSum` 中来计算最后一个子字符串的 `currentSum`。`main` 函数提供了一个提示,允许用户输入一个二进制字符串。

  • `main` 函数提供了一个提示,允许用户输入一个二进制字符串。

  • 输入字符串将传递给 `maximizeSum` 函数,返回的最大和存储在 `result` 变量中。

  • 最后,将最大和显示给用户。

方法 2

在第二种方法中,我们将通过消除执行整数乘法的需要来优化代码。取而代之的是,我们将使用按位运算来计算当前总和。我们来看看这种方法的代码片段 -

示例

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

int maximizeSum(string binaryString) {
   int maxSum = 0;
   int currentSum = 0;

   for (char c : binaryString) {
      if (c == '0') {
         currentSum = (currentSum << 1) + 0;
      } else {
         maxSum += currentSum;
         currentSum = 0;
      }
   }

   maxSum += currentSum;
   return maxSum;
}

int main() {
   string binaryString = "10110010"; // Assumed binary string
   int result = maximizeSum(binaryString);
   cout << "Maximum sum: " << result << endl;

   return 0;
}

输出

Maximum sum: 0

说明

  • 与第一种方法类似,代码首先包含必要的库并使用 `std` 命名空间。

  • `maximizeSum` 函数和 `main` 函数的定义与第一种方法中的一样。

  • 在 `maximizeSum` 函数中,按位左移运算符 (`<<`) 用于更新 `currentSum`。我们没有乘以 10,而是将 `currentSum` 的位向左移动 1,即

  • 相当于乘以 2。然后,我们向 `currentSum` 添加 0,因为当前字符为 '0'。

  • 两种方法中的其余代码相同。它们接收二进制字符串作为输入。使用 `maximizeSum` 函数来计算拆分字符串时可能的最高和。然后将此结果显示给用户。

你可以在 C++ 编译器中编译和运行这些代码,在输入二进制字符串后,程序将输出根据指定条件拆分字符串而产生的最大和。

结论

在本文中,我们探讨了基于给定条件分割二进制字符串,以实现最大化和的问题。我们提供了代码示例中所用方法的语法,并介绍了解决此问题时可以采用的两种方法。最初,我们使用直接算法,而后一种方法通过位运算优化了编码。尽管这两种方法都能成功解决问题,但后者能够提供更高的效率,因为它无需乘以整数。通过理解和实现这些算法,你可以有效地解决涉及通过分割二进制字符串最大化和值的类似问题。

上次更新: 25-Jul-2023

80 次浏览

开启你的 职业生涯

完成课程并获得认证

开始学习
广告