LeetCode 3137.K 周期字符串需要的最少操作次数:哈希表计数

【LetMeFly】3137.K 周期字符串需要的最少操作次数:哈希表计数

力扣题目链接:https://leetcode.cn/problems/minimum-number-of-operations-to-make-word-k-periodic/

给你一个长度为 n 的字符串 word 和一个整数 k ,其中 kn 的因数。

在一次操作中,你可以选择任意两个下标 ij,其中 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 ,则称字符串 wordK 周期字符串 。例如,如果 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 <= 105
  • 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

相关推荐
欧叶冲冲冲44 分钟前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
圣保罗的大教堂1 小时前
leetcode 3622. 判断整除性 简单
leetcode
Lyyaoo.2 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
圣保罗的大教堂3 小时前
leetcode 2996. 大于等于顺序前缀和的最小缺失整数 简单
leetcode
圣保罗的大教堂3 小时前
leetcode 3702. 按位异或非零的最长子序列 中等
leetcode
楠楠子呀4 小时前
从零构建高性能 WhatsApp 链接生成器与重定向服务:架构与路由解析
redis·python·容器·架构·flink·散列表·flume
青 春 记 忆5 小时前
LeetCode 206. 反转链表|Python 解法详解
python·leetcode·链表
青 春 记 忆7 小时前
LeetCode 226. 翻转二叉树|Python 解法详解
python·算法·leetcode
啊嘞嘞?8 小时前
力扣(回文链表)
算法·leetcode·链表