<p>这是一种更为自然的方法,使用简单的迭代</p>
<p><strong>它的时间复杂度为O(n)。</strong></p>
<p>它使用一个外部循环来迭代搜索键中的字符,然后使用一个内部while循环来消耗搜索字符串中该字符的所有匹配项,同时维护一个计数器。一旦当前字母的所有连续出现都被消耗,它会将<code>minLetterCount</code>更新为其先前值或此新计数的最小值。一旦我们遍历了键中的所有字母,我们将返回这个累积的最小值</p>
<pre><code>def countCompleteSequenceOccurences(searchString, key):
left = 0
minLetterCount = 0
letterCount = 0
for i, searchChar in enumerate(key):
while left < len(searchString) and searchString[left] == searchChar:
letterCount += 1
left += 1
minLetterCount = letterCount if i == 0 else min(minLetterCount, letterCount)
letterCount = 0
return minLetterCount
</code></pre>
<p>测试:</p>
<pre><code>testCasesToOracles = {
"aaaaaaappppppprrrrrriiiiiilll": 3,
"ppppppprrrrrriiiiiilll": 0,
"aaaaaaappppppprrrrrriiiiii": 0,
"aaaaaaapppppppzzzrrrrrriiiiiilll": 0,
"pppppppaaaaaaarrrrrriiiiiilll": 0,
"zaaaaaaappppppprrrrrriiiiiilll": 3,
"zzzaaaaaaappppppprrrrrriiiiiilll": 3,
"aaaaaaappppppprrrrrriiiiiilllzzz": 3,
"zzzaaaaaaappppppprrrrrriiiiiilllzzz": 3,
}
key = "april"
for case, oracle in testCasesToOracles.items():
result = countCompleteSequenceOccurences(case, key)
assert result == oracle
</code></pre>
<p>用法:</p>
<pre><code>key = "april"
result = countCompleteSequenceOccurences("aaaaaaappppppprrrrrriiiiiilll", key)
print(result * key)
</code></pre>
<p>输出:</p>
<p><code>aprilaprilapril</code></p>