给定一个二进制字符串,即它仅包含0和1。我们需要通过翻转一些位来使此字符串成为替换字符序列,我们的目标是最大程度地减少要翻转的位的数量。
例子 :
Input : str = “001”
Output : 1
Minimum number of flips required = 1
We can flip 1st bit from 0 to 1
Input : str = “0001010111”
Output : 2
Minimum number of flips required = 2
We can flip 2nd bit from 0 to 1 and 9th
bit from 1 to 0 to make alternate
string “0101010101”.
预期时间复杂度:O(n)其中n是输入字符串的长度。
我们可以考虑所有可能的结果来解决此问题,因为我们应该获得替代字符串,所以只有2种可能性,替代字符串以0开头,替代字符串以1开头。我们将尝试两种情况,然后选择需要的字符串最少的翻转次数是我们的最终答案。
尝试一种情况需要O(n)时间,在该时间内我们将循环遍历给定字符串的所有字符,如果当前字符是根据交替期望的字符,则我们将不执行任何操作,否则我们将翻转计数增加1。尝试以0开头的字符串之后从1开始,我们将选择翻转次数最少的字符串。
解决方案的总时间复杂度将为O(n)
C++
// C/C++ program to find minimum number of
// flip to make binary string alternate
#include
using namespace std;
// Utility method to flip a character
char flip(char ch)
{
return (ch == '0') ? '1' : '0';
}
// Utility method to get minimum flips when
// alternate string starts with expected char
int getFlipWithStartingCharcter(string str,
char expected)
{
int flipCount = 0;
for (int i = 0; i < str.length(); i++)
{
// if current character is not expected,
// increase flip count
if (str[i] != expected)
flipCount++;
// flip expected character each time
expected = flip(expected);
}
return flipCount;
}
// method return minimum flip to make binary
// string alternate
int minFlipToMakeStringAlternate(string str)
{
// return minimum of following two
// 1) flips when alternate strign starts with 0
// 2) flips when alternate strign starts with 1
return min(getFlipWithStartingCharcter(str, '0'),
getFlipWithStartingCharcter(str, '1'));
}
// Driver code to test above method
int main()
{
string str = "0001010111";
cout << minFlipToMakeStringAlternate(str);
return 0;
}
Java
// Java program to find minimum number of
// flip to make binary string alternate
class GFG
{
// Utility method to flip a character
public static char flip(char ch)
{
return (ch == '0') ? '1' : '0';
}
// Utility method to get minimum flips when
// alternate string starts with expected char
public static int getFlipWithStartingCharcter(String str,
char expected)
{
int flipCount = 0;
for (int i = 0; i < str.length(); i++)
{
// if current character is not expected,
// increase flip count
if (str.charAt(i) != expected)
flipCount++;
// flip expected character each time
expected = flip(expected);
}
return flipCount;
}
// method return minimum flip to make binary
// string alternate
public static int minFlipToMakeStringAlternate(String str)
{
// return minimum of following two
// 1) flips when alternate string starts with 0
// 2) flips when alternate string starts with 1
return Math.min(getFlipWithStartingCharcter(str, '0'),
getFlipWithStartingCharcter(str, '1'));
}
// Driver code to test above method
public static void main(String args[])
{
String str = "0001010111";
System.out.println(minFlipToMakeStringAlternate(str));
}
}
// This code is contributed by Sumit Ghosh
Python 3
# Python 3 program to find minimum number of
# flip to make binary string alternate
# Utility method to flip a character
def flip( ch):
return '1' if (ch == '0') else '0'
# Utility method to get minimum flips when
# alternate string starts with expected char
def getFlipWithStartingCharcter(str, expected):
flipCount = 0
for i in range(len( str)):
# if current character is not expected,
# increase flip count
if (str[i] != expected):
flipCount += 1
# flip expected character each time
expected = flip(expected)
return flipCount
# method return minimum flip to make binary
# string alternate
def minFlipToMakeStringAlternate(str):
# return minimum of following two
# 1) flips when alternate strign starts with 0
# 2) flips when alternate strign starts with 1
return min(getFlipWithStartingCharcter(str, '0'),
getFlipWithStartingCharcter(str, '1'))
# Driver code to test above method
if __name__ == "__main__":
str = "0001010111"
print(minFlipToMakeStringAlternate(str))
C#
// C# program to find minimum number of
// flip to make binary string alternate
using System;
class GFG
{
// Utility method to
// flip a character
public static char flip(char ch)
{
return (ch == '0') ? '1' : '0';
}
// Utility method to get minimum flips
// when alternate string starts with
// expected char
public static int getFlipWithStartingCharcter(String str,
char expected)
{
int flipCount = 0;
for (int i = 0; i < str.Length; i++)
{
// if current character is not
// expected, increase flip count
if (str[i] != expected)
flipCount++;
// flip expected character each time
expected = flip(expected);
}
return flipCount;
}
// method return minimum flip to
// make binary string alternate
public static int minFlipToMakeStringAlternate(string str)
{
// return minimum of following two
// 1) flips when alternate string starts with 0
// 2) flips when alternate string starts with 1
return Math.Min(getFlipWithStartingCharcter(str, '0'),
getFlipWithStartingCharcter(str, '1'));
}
// Driver Code
public static void Main()
{
string str = "0001010111";
Console.Write(minFlipToMakeStringAlternate(str));
}
}
// This code is contributed by nitin mittal.
PHP
Javascript
输出 :
2
使二进制字符串交替的最小替换数套装2