Description
You are given a binary string s. You are allowed to perform two types of operations on the string in any sequence:
- Type-1: Remove the character at the start of the string sand append it to the end of the string.
- Type-2: Pick any character in sand flip its value, i.e., if its value is'0'it becomes'1'and vice-versa.
Return the minimum number of type-2 operations you need to perform such that s becomes alternating.
The string is called alternating if no two adjacent characters are equal.
- For example, the strings "010"and"1010"are alternating, while the string"0100"is not.
Β
Example 1:
Input: s = "111000" Output: 2 Explanation: Use the first operation two times to make s = "100011". Then, use the second operation on the third and sixth elements to make s = "101010".
Example 2:
Input: s = "010" Output: 0 Explanation: The string is already alternating.
Example 3:
Input: s = "1110" Output: 1 Explanation: Use the second operation on the second element to make s = "1010".
Β
Constraints:
- 1 <= s.length <= 105
- s[i]is either- '0'or- '1'.
Solution
Python3
class Solution:
    def minFlips(self, s: str) -> int:
        n = len(s)
        s += s
        
        A, B = '', ''
        for i in range(len(s)):
            A += '1' if i % 2 == 0 else '0'
            B += '0' if i % 2 == 0 else '1'
        
        res = float('inf')
        count1 = count2 = 0
        
        for i in range(len(s)):
            if A[i] != s[i]: count1 += 1
            if B[i] != s[i]: count2 += 1
            
            if i >= n:
                if A[i - n] != s[i - n]: count1 -= 1
                if B[i - n] != s[i - n]: count2 -= 1
            
            if i >= n - 1:
                res = min(res, count1, count2)
            
        return res