<p>Given a string <code>s</code> consisting of lowercase English letters. Perform the following operation:</p>

<ul>
	<li>Select any non-empty <span data-keyword="substring-nonempty">substring</span> then replace every letter of the substring with the preceding letter of the English alphabet. For example, &#39;b&#39; is converted to &#39;a&#39;, and &#39;a&#39; is converted to &#39;z&#39;.</li>
</ul>

<p>Return the <span data-keyword="lexicographically-smaller-string"><strong>lexicographically smallest</strong></span> string <strong>after performing the operation</strong>.</p>

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

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;cbabc&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">&quot;baabc&quot;</span></p>

<p><strong>Explanation:</strong></p>

<p>Perform the operation on the substring starting at index 0, and ending at index 1 inclusive.</p>
</div>

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

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;aa&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">&quot;az&quot;</span></p>

<p><strong>Explanation:</strong></p>

<p>Perform the operation on the last letter.</p>
</div>

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

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;acbbc&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">&quot;abaab&quot;</span></p>

<p><strong>Explanation:</strong></p>

<p>Perform the operation on the substring starting at index 1, and ending at index 4 inclusive.</p>
</div>

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

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;leetcode&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">&quot;kddsbncd&quot;</span></p>

<p><strong>Explanation:</strong></p>

<p>Perform the operation on the entire string.</p>
</div>

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

<ul>
	<li><code>1 &lt;= s.length &lt;= 3 * 10<sup>5</sup></code></li>
	<li><code>s</code> consists of lowercase English letters</li>
</ul>

class Solution:
    def smallestString(self, s: str) -> str:
        # 这道题目a开头的肯定是最小的
        check = set(s)
        if len(check) == 1 and check != {'a'}: #如果字符串中的所有字符都相同，并且这些字符不等于 'a'，因为如果字符串由 'a' 组成，不需要进一步处理。
            return chr(ord(s[0])-1)*(len(s)) #例如：如果 s = "bbb"，len(s) 是 3，减 1 后得到 'a'，于是返回 "aaa"。

        contiguous, change, ct1, ct2 = True, False, 0, 0  #contiguous: 表示是否字符是连续变化的  #change: 表示是否有任何字符被修改过

        for i in s:                                       
            if i == 'a': #如果字符是 'a'，增加计数器 ct1
                ct1 += 1                                                  
            else: #一旦遇到非 'a' 的字符，停止循环。
                break
        ans='' + 'a' * ct1 #创建一个新的字符串 ans，它是前面连续的 ct1 个 'a' 的副本。 如果没有a 这里的ans = ""
        s = s[ct1:] #更新字符串 s，去掉前面统计的连续 'a' 部分，只保留后面的部分。如果没有a，这里的s 会保留原样
        
        #开始遍历 s 剩下的部分字符。
        for cha in s:
            ct2 += 1 #ct2 的值表示当前遍历到的字符在更新后的字符串s中的位置。
            if cha != 'a':
                ans += chr(ord(cha)-1)
                change = True                               
                continue
            else: #如果字符是 'a'，将其原封不动加入到 ans 中。
                ans += cha                                  
                if change:#如果已经有修改过字符（change=True），设置 contiguous=False，表示修改之后不再是连续字符                           
                    contiguous = False
            if not contiguous:#如果修改后的字符不再是连续的，退出循环，不再继续处理后续字符。                            
                break
        return ans + s[ct2:] if change else ans[:-1] + 'z'  #s[ct2:] 代表了还没有进行任何处理的字符。
        #-1 代表最后一个字符，所以 ans[:-1] 会返回去掉最后一个字符的子字符串， 然后将字符 'z' 拼接到这个子字符串后面
        
20200