当前位置: 首页 > news >正文

2516. 每种字符至少取 K 个

Powered by:NEFU AB-IN

Link

文章目录

  • 2516. 每种字符至少取 K 个
    • 题意
    • 思路
    • 代码

2516. 每种字符至少取 K 个

题意

给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟,你可以选择取走 s 最左侧 还是 最右侧 的那个字符。

你必须取走每种字符 至少 k 个,返回需要的 最少 分钟数;如果无法取到,则返回 -1 。

思路

逆向思考:与其思考要取走哪些字符,不如考虑可以保留的最长子串,使得该子串中每种字符的数量不超过 total_counts[char] - k。这样,从两端取走的字符将确保我们至少取走了每种字符的 k 个。
使用滑动窗口技术:在字符串 s 上使用滑动窗口,寻找满足条件的最长子串。我们在窗口内维护每个字符的计数,并根据计数调整窗口大小。

代码

'''
Author: NEFU AB-IN
Date: 2024-09-27 19:41:44
FilePath: \LeetCode\2516\2516.py
LastEditTime: 2024-09-27 19:41:54
'''
# 3.8.9 import
import bisect
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache, reduce
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin
from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar# Constants
TYPE = TypeVar('TYPE')
N = int(2e5 + 10)
M = int(20)
INF = int(1e12)
OFFSET = int(100)
MOD = int(1e9 + 7)# Set recursion limit
setrecursionlimit(int(2e9))class Arr:array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)])array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)])graph = staticmethod(lambda size=N: [[] for _ in range(size)])class Math:max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)class Std:pass# ————————————————————— Division line ——————————————————————class Solution:def takeCharacters(self, s: str, k: int) -> int:n = len(s)total_counts = Counter(s)# 检查每个字符是否至少出现了 k 次if any(total_counts[char] < k for char in 'abc'):return -1# 计算在保留的子串中,每个字符的最大允许次数required = {char: total_counts[char] - k for char in 'abc'}max_length = 0counts = {'a': 0, 'b': 0, 'c': 0}left = 0# 使用滑动窗口遍历字符串for right in range(n):counts[s[right]] += 1# 如果窗口内某个字符的计数超过了允许的最大次数,收缩窗口while any(counts[char] > required[char] for char in 'abc') and left <= right:counts[s[left]] -= 1left += 1current_window_length = right - left + 1max_length = Math.max(max_length, current_window_length)# 返回需要取走的最少字符数return n - max_length

http://www.mrgr.cn/news/37891.html

相关文章:

  • 【顺序表使用练习】发牌游戏
  • java设计模式
  • Java项目——苍穹外卖总结
  • 基于 C# 的文本文件的编码识别
  • ARM点灯---看手册
  • LLM Agent系列 | 端侧Agent路由器,合纵连横AI江湖,破局端侧大模型之困!
  • LeetCode[中等] 78.子集
  • Vue 3 技术体系
  • 基于Hive和Hadoop的电商消费分析系统
  • Meta震撼发布Llama3.2大规模模型
  • BufferQueue低延迟优化,以及SurfaceView帧率上限问题解决
  • 线性代数~行列式计算
  • 一款开源的通用PDF处理神器,功能强悍!
  • SpringBoot整合JPA实现CRUD详解
  • 【HTML|第1期】HTML5视频(Video)元素详解:从起源到应用
  • 鸿蒙开发(NEXT/API 12)【硬件(接入手写套件)】手写功能开发
  • 算法——冒泡排序
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
  • 手搓一个Agent#Datawhale 组队学习Task3
  • 1013. 将数组分成和相等的三个部分 数组切分