📌  相关文章
📜  使二进制字符串交替的翻转次数|套装1

📅  最后修改于: 2021-04-27 22:45:16             🧑  作者: Mango

给定一个二进制字符串,即它仅包含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