给定一个长度为N的二进制字符串str和一个整数K ,任务是找到通过翻转给定二进制字符串中最多 K位可以获得的分配权重的最大可能总和。分配给该字符串的字符的权重如下:
- 如果字符为‘0’ ,则权重为0 。
- 如果一个字符是‘1’并且它前面的字符也是‘1’ ,那么权重是2 。
- 如果一个字符是‘1’并且它前面没有字符或者它前面的字符是‘0’ ,那么权重是1 。
例子:
Input: str = “10100”, K = 2
Output: 7
Explanation:
1st flip: Flip the character at index 1, the string becomes “11100”.
2nd flip: Flip the character at index 3, the string becomes “11110”.
The weight of the resulting string is 1 + 2 + 2 + 2 + 0 = 7, which is maximum.
Input: str = “100101”, K = 1
Output: 6
Explanation:
1st flip: Flip the character at index 5, the string becomes “100111”.
The weight of the resulting string is 1 + 0 + 0 + 1 + 2 + 2 = 6, which is maximum.
做法:字符“1”的“1”之后出现的重量是所有字符中最伟大的,所以最大限度的总和,尽量创造尽可能多这样的1秒。要翻转为1的0段可以按如下优先级排序:
- 第一优先级:翻转包含在两个1之间的所有0 ,这将使表格10…01的段的权重增加(2*(包含的0数)+ 1)。如果 x 大于或等于所包含的0数,否则为 2*(所包含的 0 数)。
- 第二优先度”以1秒的第一次出现之前的字符串中的字符串的开头翻转为0,这将增加形式0的链段的重…由2 *(翻转数的0的)01。
- 第三优先级:在字符串中最后一次出现1之后的字符串末尾翻转0 ,这将使10…0形式的段的权重增加 2*(翻转 0 的数量)。
按照上述优先级翻转给定字符串的字符以最大化权重,然后在最多K次翻转后找到结果字符串的权重。
下面是这个方法的实现:
C++
Python3
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。