Every day a Leetcode
解法1:哈希
根据题意,我们只能选择首字母下标为 0、k、2k、3k、⋯、n−k 的子串来操作(替换),并且这些子串的长度都为 k。
为使操作次数尽量少,我们可以计算最多保留多少个子串不变。也就是统计 word 中的这些首字母下标为 0、k、2k、3k、⋯、n−k 的长为 k 的子串中,出现次数最多的子串的出现次数 maxFreq。用出现次数最多的子串,替换其余子串。
最少操作次数 = 子串个数 - 出现次数最多的子串的出现次数 = n/k - maxFreq。
代码:
class Solution
{
public:
int minimumOperationsToMakeKPeriodic(string word, int k)
{
int n = word.length();
unordered_map<string, int> freq;
for (int i = 0; i < n; i += k)
{
string temp = word.substr(i, k);
freq[temp]++;
}
int maxFreq = 1, total = n / k;
for (auto &[s, cnt] : freq)
{
if (cnt > maxFreq)
maxFreq = cnt;
}
return total - maxFreq;
}
};
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 word 的长度。
空间复杂度:O(n),其中 n 是字符串 word 的长度。