在一次操作中,你可以选择任意两个下标 i 和 j,其中 0 <= i, j < n ,且这两个下标都可以被 k 整除,然后用从 j 开始的长度为 k 的子串替换从 i 开始的长度为 k 的子串。也就是说,将子串 word[i..i + k - 1] 替换为子串 word[j..j + k - 1] 。
返回使 word 成为 K 周期字符串 所需的 最少 操作次数。
如果存在某个长度为 k 的字符串 s,使得 word 可以表示为任意次数连接 s ,则称字符串 word 是 K 周期字符串 。例如,如果 word == "ababab",那么 word 就是 s = "ab" 时的 2 周期字符串 。
classSolution { public: intminimumOperationsToMakeKPeriodic(string& word, int k){ unordered_map<string, int> ma; int maxTimes = 1; for (int i = 0; i < word.size(); i += k) { maxTimes = max(maxTimes, ++ma[word.substr(i, k)]); } return word.size() / k - maxTimes; } };
Go
1 2 3 4 5 6 7 8 9 10 11
package main
funcminimumOperationsToMakeKPeriodic(word string, k int)int { maxTimes := 1 ma := map[string]int{} for i := 0; i < len(word); i += k { ma[word[i: i + k]]++ maxTimes = max(maxTimes, ma[word[i: i + k]]) } returnlen(word) / k - maxTimes }
Python
1 2 3 4 5 6 7 8 9 10 11 12
from typing importList from collections import defaultdict
classSolution: defminimumOperationsToMakeKPeriodic(self, word: str, k: int) -> int: ma = defaultdict(int) maxTimes = 1 for i inrange(0, len(word), k): ma[word[i: i + k]] += 1 maxTimes = max(maxTimes, ma[word[i: i + k]]) returnlen(word) // k - maxTimes
使用Counter一行版:
1 2 3 4 5
from collections import Counter
classSolution: defminimumOperationsToMakeKPeriodic(self, word: str, k: int) -> int: returnlen(word) // k - max(Counter(word[i : i + k] for i inrange(0, len(word), k)).values())
Java
1 2 3 4 5 6 7 8 9 10 11 12 13
import java.util.HashMap;
classSolution { publicintminimumOperationsToMakeKPeriodic(String word, int k) { intmaxTimes=1; HashMap<String, Integer> ma = newHashMap<String, Integer>(); for (inti=0; i < word.length(); i += k) { // maxTimes = ma.merge(word.substring(i, i + k), 1, (a, b) -> {a += b; maxTimes = Math.max(maxTimes, a); return a;}); maxTimes = Math.max(maxTimes, ma.merge(word.substring(i, i + k), 1, Integer::sum)); } return word.length() / k - maxTimes; } }