<p>You are given a binary string <code>s</code>. You are allowed to perform two types of operations on the string in any sequence:</p>

<ul>
	<li><strong>Type-1: Remove</strong> the character at the start of the string <code>s</code> and <strong>append</strong> it to the end of the string.</li>
	<li><strong>Type-2: Pick</strong> any character in <code>s</code> and <strong>flip</strong> its value, i.e., if its value is <code>&#39;0&#39;</code> it becomes <code>&#39;1&#39;</code> and vice-versa.</li>
</ul>

<p>Return <em>the <strong>minimum</strong> number of <strong>type-2</strong> operations you need to perform</em> <em>such that </em><code>s</code> <em>becomes <strong>alternating</strong>.</em></p>

<p>The string is called <strong>alternating</strong> if no two adjacent characters are equal.</p>

<ul>
	<li>For example, the strings <code>&quot;010&quot;</code> and <code>&quot;1010&quot;</code> are alternating, while the string <code>&quot;0100&quot;</code> is not.</li>
</ul>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;111000&quot;
<strong>Output:</strong> 2
<strong>Explanation</strong>: Use the first operation two times to make s = &quot;100011&quot;.
Then, use the second operation on the third and sixth elements to make s = &quot;10<u>1</u>01<u>0</u>&quot;.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;010&quot;
<strong>Output:</strong> 0
<strong>Explanation</strong>: The string is already alternating.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;1110&quot;
<strong>Output:</strong> 1
<strong>Explanation</strong>: Use the second operation on the second element to make s = &quot;1<u>0</u>10&quot;.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 10<sup>5</sup></code></li>
	<li><code>s[i]</code> is either <code>&#39;0&#39;</code> or <code>&#39;1&#39;</code>.</li>
</ul>

class Solution:
    def minFlips(self, s: str) -> int:
        # Minimum number of flips to return
        minimumFlips = len(s)
        
        # Window Size
        k = len(s)
        
        # For strings of odd length, double them
        # So that we do not have to manually perform type-1 operation 
        # that is, taking each bit and moving to end of string

        # For even strings, it does not matter if we perfom type-1 as either altArr1 or altArr2
        # will cover each case
        s = s if k % 2 == 0 else s + s
        
        # There can be only two valid alternating strings as we only have 0 and 1
        # One starts with 0 and other with 1
        # e.g. for a string of length 3 we can have either 010 or 101
        altArr1, altArr2 = [], []        
        for i in range(len(s)):
            altArr1.append("0" if i % 2 == 0 else "1")
            altArr2.append("1" if i % 2 == 0 else "0")
            
        alt1 = "".join(altArr1)
        alt2 = "".join(altArr2)
        
        
        # Minimum Number of operations = Minimum Difference between the string and alt2 and alt3
        diff1, diff2 = 0,0
        
        # Sliding Window Template Begins
        i,j = 0,0
        
        
        while j < len(s):
            if s[j] != alt1[j] : diff1 += 1
            if s[j] != alt2[j] : diff2 += 1
                
            if j - i + 1 < k: j += 1
            else:
                # print(i, j)
                minimumFlips = min(minimumFlips, diff1, diff2)
                if s[i] != alt1[i] : diff1 -= 1
                if s[i] != alt2[i] : diff2 -= 1
                i += 1
                j += 1

            # print(i, j, diff1, diff2)
        
        return minimumFlips
23100