Skip to content

3137 Minimum Number of Operations to Make Word K-Periodic

Approach 1

有一个数组,可以分为n//k个segment, 每个segment的长度为k,我们可以用一个hashtable来记录每个segment的出现次数,然后找到出现次数最多的segment. 这个就是不动的segment,其它的segment都需要被替换。

For example, word = leetcodeleet and k = 4, 可以分为leet, code, leet三个segment, 统计一下,

{
    "leet": 2,
    "code": 1
}

由此我们可以看到,leet出现了两次,最划算的operation时只需要替换一次就可以了。

!!! note '复杂度分析'

- time complexity: $O(\frac{n}{k})$
- space complexity: $O(\frac{n}{k})$

Code Implementation

from collections import defaultdict
class Solution:
    def minimumOperationsToMakeKPeriodic(self, word: str, k: int) -> int:
        """
         1.  4.  8
        [leetcodelee t ]
         01234567891011
         we replace
         - [0..3] with [4..7]
         - [4..7] with [8..11]

          0 2 4 6 8
         [leetcoleet]
          0123456789

        example 1分成3等份
        example 2分成5等份
        只有最后一个segment不能被替换,所以我们可以利用count次数来决定
        """
        n = len(word)
        # target = word[n-k:n]
        hashtable = defaultdict(int)

        global_max = 0
        for i in range(n//k):
            start = i*k
            end = (i+1)*k
            hashtable[word[start:end]] += 1
            global_max = max(global_max,hashtable[word[start:end]])

        return n//k - global_max