k 次旋转后二进制字符串中可能的最大连续 1
给定一个二进制字符串,您可以旋转该字符串的任何子字符串。例如,让字符串用 s 表示。让字符串的第一个元素用 s[0] 表示,第二个元素用 s[1] 表示,依此类推。
s = “100110111”
假设,我们旋转从 s[2] 开始到 s[4] 结束的子字符串。那么此操作后的字符串将是:
结果字符串 = “101100111”
现在,您最多可以执行 k 次操作来旋转任何子字符串。你必须告诉你可以在这个字符串中以 k 或少于 k 个子字符串旋转的方式制作的最大连续 1 数。
例子:
Input : 100011001
k = 1
Output : 3
Explanation:
k is 1, hence you can rotate only once. Rotate the substring starting from s[1] and ending at s[5]. The resultant string will be : 111000001. Hence, maximum contiguous 1 are 3.
Input : 001100111000110011100
k = 2
Output : 8
Explanation:
k is 2, hence you can rotate twice. Rotate the substring starting at s[6] and ending at s[15]. Resultant string after first rotation : 001100001100011111100. Then, rotate the substring starting at s[8] and ending at s[12]. Resultant string after second rotation : 001100000001111111100. Hence, maximum number of contiguous 1 are 8.
解决概念:
为了解决这个问题,我们将在多重集中保持原始字符串中连续 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