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 <= 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

相关推荐
理论最高的吻29 分钟前
98. 验证二叉搜索树【 力扣(LeetCode) 】
数据结构·c++·算法·leetcode·职场和发展·二叉树·c
沈小农学编程34 分钟前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O1 小时前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
木向1 小时前
leetcode:114. 二叉树展开为链表
算法·leetcode·链表
无限大.2 小时前
力扣题解3248 矩阵中的蛇(简单)
算法·leetcode·矩阵
戊子仲秋4 小时前
【LeetCode】每日一题 2024_11_21 矩阵中的蛇(模拟)
算法·leetcode·矩阵
wang_changyue6 小时前
CSP-X2024解题报告(T3)
数据结构·算法·leetcode
Tisfy10 小时前
LeetCode 3240.最少翻转次数使二进制矩阵回文 II:分类讨论
算法·leetcode·矩阵·题解·回文·分类讨论
Tisfy12 小时前
LeetCode 3244.新增道路查询后的最短距离 II:贪心(跃迁合并)-9行py(O(n))
算法·leetcode·题解·贪心·思维
DdddJMs__13512 小时前
C语言 | Leetcode C语言题解之第564题寻找最近的回文数
c语言·leetcode·题解