<p>A password is considered strong if the below conditions are all met:</p>

<ul>
	<li>It has at least <code>6</code> characters and at most <code>20</code> characters.</li>
	<li>It contains at least <strong>one lowercase</strong> letter, at least <strong>one uppercase</strong> letter, and at least <strong>one digit</strong>.</li>
	<li>It does not contain three repeating characters in a row (i.e., <code>&quot;B<u><strong>aaa</strong></u>bb0&quot;</code> is weak, but <code>&quot;B<strong><u>aa</u></strong>b<u><strong>a</strong></u>0&quot;</code> is strong).</li>
</ul>

<p>Given a string <code>password</code>, return <em>the minimum number of steps required to make <code>password</code> strong. if <code>password</code> is already strong, return <code>0</code>.</em></p>

<p>In one step, you can:</p>

<ul>
	<li>Insert one character to <code>password</code>,</li>
	<li>Delete one character from <code>password</code>, or</li>
	<li>Replace one character of <code>password</code> with another character.</li>
</ul>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> password = "a"
<strong>Output:</strong> 5
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> password = "aA1"
<strong>Output:</strong> 3
</pre><p><strong class="example">Example 3:</strong></p>
<pre><strong>Input:</strong> password = "1337C0d3"
<strong>Output:</strong> 0
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= password.length &lt;= 50</code></li>
	<li><code>password</code> consists of letters, digits, dot&nbsp;<code>&#39;.&#39;</code> or exclamation mark <code>&#39;!&#39;</code>.</li>
</ul>

class Solution:
    def strongPasswordChecker(self, password: str) -> int:

        lengthpass = len(password)
        
        
        conditions = 3
        
        if any('a' <= c <= 'z' for c in password):
            conditions -= 1
        if any('A' <= c <= 'Z' for c in password):
            conditions -= 1
        if any(c.isdigit() for c in password):
            conditions -= 1
    
        
        changes = 0

        changeone = 0
        changetwo = 0

        length = 0

        i = 2

        while i < (len(password)):
            if password[i] == password[i-1] == password[i-2]:
                length = 2
                #Confirms the length is 2, and moves on to see how long the string of repeating characters is
                while i < len(password) and password[i] == password[i-1]:
                    length += 1
                    i += 1
                changes += (length//3)
                if length%3 == 0: 
                    changeone += 1
                elif length%3 == 1: 
                    changetwo += 1

            else:
                i += 1
        if lengthpass < 6:
            if changeone == changetwo == 0:
                return 6 - lengthpass + changes
            else:
                return 6 - lengthpass
        if lengthpass <= 20:
            return (max(conditions, round(changes)))
        else:
            delete = lengthpass - 20
            changes -= min(delete, changeone)
            changes -= min(max(delete - changeone, 0), 2 * changetwo) // 2
            changes -= max(delete - changeone - 2 * changetwo, 0) // 3


            return round((delete + max(conditions , changes)))
            
            

        

            


        
16300