【LetMeFly】3137.K 周期字符串需要的最少操作次数:哈希表计数
力扣题目链接:https://leetcode.cn/problems/minimum-number-of-operations-to-make-word-k-periodic/
给你一个长度为 n
的字符串 word
和一个整数 k
,其中 k
是 n
的因数。
在一次操作中,你可以选择任意两个下标 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 周期字符串 。
示例 1:
输入: word = "leetcodeleet", k = 4
输出: 1
**解释:**可以选择 i = 4 和 j = 0 获得一个 4 周期字符串。这次操作后,word 变为 "leetleetleet" 。
示例 2:
输入: word = "leetcoleet", k = 2
**输出:**3
**解释:**可以执行以下操作获得一个 2 周期字符串。
i | j | word |
---|---|---|
0 | 2 | etetcoleet |
4 | 0 | etetetleet |
6 | 0 | etetetetet |
提示:
1 <= n == word.length <= 10
^5^1 <= k <= word.length
k
能整除word.length
。word
仅由小写英文字母组成。
解题方法:哈希表计数
题目意思是将字符串分成 l e n ( w o r d ) k \frac{len(word)}{k} klen(word)个块,然后每次可以使用一个块去覆盖另一个块,问至少需要多少次能把所有块变成一样的。
那当然是哪一块最多,就尽量把所有的其他块变成那一块。因此,使用哈希表统计每种块的出现次数,将其他所有块变成这一块就好了。
- 时间复杂度 O ( l e n ( w o r d ) ) O(len(word)) O(len(word))
- 空间复杂度 O ( k ) O(k) O(k)
AC代码
C++
cpp
class Solution {
public:
int minimumOperationsToMakeKPeriodic(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
go
package main
func minimumOperationsToMakeKPeriodic(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]])
}
return len(word) / k - maxTimes
}
Python
python
from typing import List
from collections import defaultdict
class Solution:
def minimumOperationsToMakeKPeriodic(self, word: str, k: int) -> int:
ma = defaultdict(int)
maxTimes = 1
for i in range(0, len(word), k):
ma[word[i: i + k]] += 1
maxTimes = max(maxTimes, ma[word[i: i + k]])
return len(word) // k - maxTimes
使用Counter一行版:
python
from collections import Counter
class Solution:
def minimumOperationsToMakeKPeriodic(self, word: str, k: int) -> int:
return len(word) // k - max(Counter(word[i : i + k] for i in range(0, len(word), k)).values())
Java
java
import java.util.HashMap;
class Solution {
public int minimumOperationsToMakeKPeriodic(String word, int k) {
int maxTimes = 1;
HashMap<String, Integer> ma = new HashMap<String, Integer>();
for (int i = 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;
}
}
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/141284611