📌  相关文章
📜  k 次旋转后二进制字符串中可能的最大连续 1

📅  最后修改于: 2022-05-13 01:57:08.131000             🧑  作者: Mango

k 次旋转后二进制字符串中可能的最大连续 1

给定一个二进制字符串,您可以旋转该字符串的任何子字符串。例如,让字符串用 s 表示。让字符串的第一个元素用 s[0] 表示,第二个元素用 s[1] 表示,依此类推。
s = “100110111”

假设,我们旋转从 s[2] 开始到 s[4] 结束的子字符串。那么此操作后的字符串将是:
结果字符串 = “101100111”

现在,您最多可以执行 k 次操作来旋转任何子字符串。你必须告诉你可以在这个字符串中以 k 或少于 k 个子字符串旋转的方式制作的最大连续 1 数。

例子:

解决概念:
为了解决这个问题,我们将在多重集中保持原始字符串中连续 1 部分中 1 的频率。然后在每次旋转时,我们将旋转该子字符串,使得字符串中连续的 1(具有最大频率)的 2 部分聚集在一起。我们将通过从最大到最小元素对多重集进行排序来做到这一点。我们将取出 multiset 的前 2 个元素并将它们的总和插入到 multiset 中。我们将继续这样做,直到完成 k 次旋转或 multiset 中的元素数量减少到 1。

// C++ program to calculate maximum contiguous
// ones in string
#include 
using namespace std;
  
// function to calculate maximum contiguous ones
int maxContiguousOnes(string s, int k)
{
  
    int i, j, a, b, count;
  
    // multiset is used to store frequency  of 
    // 1's of each portion of contiguous 1 in 
    // string in decreasing order
    multiset > m;
  
    // this loop calculate all the frequency
    // and stores them in multiset
    for (i = 0; i < s.length(); i++) {
        if (s[i] == '1') {
            count = 0;
            j = i;
            while (s[j] == '1' && j < s.length()) {
                count++;
                j++;
            }
            m.insert(count);
            i = j - 1;
        }
    }
  
    // if their is no 1 in string, then return 0
    if (m.size() == 0)
        return 0;
  
    // calculates maximum contiguous 1's on
    // doing rotations
    while (k > 0 && m.size() != 1) {
  
        // Delete largest two elements
        a = *(m.begin()); 
        m.erase(m.begin()); 
        b = *(m.begin()); 
        m.erase(m.begin()); 
  
        // insert their sum back into the multiset
        m.insert(a + b); 
        k--;
    }
  
    // return maximum contiguous ones 
    // possible after k rotations
    return *(m.begin());
}
  
// Driver code
int main()
{
    string s = "10011110011";
    int k = 1;
    cout << maxContiguousOnes(s, k);
    return 0;
}
输出:
6