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

Leetcode-每日一题1234. 替换子串得到平衡字符串(滑动窗口 + 哈希表)

在这里插入图片描述
题目链接:https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/

思路

题目意思

这题意思是一个只含有[Q, W, E, R] 四个字符的字符串s且长度一定是 4的倍数, 需要你通过替换子串,使他变成一个「平衡字符串」,也就是字符串s内四个字符的数量都相等。

首先要仔细审题,我刚开始是以为计算需要替换的字符的数量,秒wa,仔细阅读发现是替换连续子串,需要找到一个最小长度的替换连续子串,第一反应就是滑动窗口或者双指针。

算法小课堂
滑动窗口:滑动窗口是双指针的一种特例,可以称为左右指针,在任意时刻,只有一个指针运动,而另一个保持静止。滑动窗口路一般用于解决特定的序列中符合条件的连续的子序列的问题。
滑动窗口的时间复杂度是线性的,时间复杂度一般为O(n),滑动窗口的左右边界都不会向左滑动,向左滑动等于走回头路,是一种回溯的算法,很可能会陷入死循环。滑动窗口是一种全遍历问题,一定会遍历到末尾的。

方法:滑动窗口 + 哈希表

刚开始我们用哈希表统计出四个字符的数量,我们需要满足「平衡字符串」,所以定义一个 check函数 判断四个字符数量小于等于 n / 4。

  • 如果原始的 s 就是 「平衡字符串」,则返回 0。
  • 如果不是,接下来就是用滑动窗口来遍历字符串,找到待替换子串,来维护区间 [l,r) :
    • 当前 l 指针不动, 通过内循环移动 r 指针,循环条件 r 指针需小于字符串s长度并且check函数满足,直到找到待替换子串。
    • 如果找到了使得条件被满足的 r,我们用 r−l 来更新答案 ans,当前 r 指针不动,并使得 l向右移动一个单位进行下一次枚举,通过外循环移动 l 指针, 循环条件 l 指针需小于字符串s长度,使当前代替换子串合法并且最小。
    • 直到 r 指针移动到大于等于字符串s长度的位置,且check函数不满足,退出循环。

代码示例

func balancedString(s string) int {n := len(s)mp := make(map[byte]int)for _, v := range s {mp[byte(v)]++}// 判断当前字符串是否是平衡字符串check := func() bool {if mp['Q'] > n / 4 || mp['W'] > n / 4 ||mp['E'] > n / 4 || mp['R'] > n / 4 {return false}return true}if check() {return 0}r, ans := 0, len(s)// 滑动窗口for l, c := range s {for r < n && !check() {mp[s[r]]--r++}// 如果上面循环是 r >= n 条件退出,// 表示现在的连续子串是不满足替换条件的,可以直接退出,避免影响正确答案if !check() {break}ans = min(ans, r - l)mp[byte(c)]++}return ans
}func min(a, b int) int {if a > b {return b}return a
}

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n),其中n表示字符串s的长度,记录四个字符的数量需要遍历字符串s,所需时间为O(n),滑动窗口时间是线性的,所以所需时间也为O(n)。
  • 空间复杂度:O(1),不需要额外申请空间。
http://www.lryc.cn/news/4673.html

相关文章:

  • linux命令小结-查看日志命令
  • Java知识点细节简易汇总——(8)枚举和注解+Java面向对象高级作业
  • 快速上手JVM- Java Virtual Machine面试不用慌
  • 安警官的IP地址是怎样定位到莽村附近的?
  • STL中重要容器vector总结
  • 11_会话原理与实现流程
  • Java测试——junit的使用(2)
  • 数据库(六): MySQL的主从复制和读写分离
  • 编程思想-0x00架构
  • QCon演讲实录(上):多云环境下应用管理与交付实践
  • async thunk 解决 API 调用的依赖问题
  • java 黑马头条 day3 实名认证分布式事务问题 seata
  • 测试开发之Django实战示例 第七章 创建电商网站
  • 【C++之容器篇】造轮子:list的模拟实现与使用
  • 自动驾驶:决策规划算法岗位面经分享
  • 2.7、进程调度的时机、切换与过程、方式
  • 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
  • ESP32S3系列--SPI从机驱动详解(一)
  • 【实战篇】移动端H5网页在ios滑动不流畅和禁止缩放问题
  • 12 循环神经网络(基础篇) Basic RNN
  • 【C语言必经之路——第11节】初阶指针(2)
  • SpringBoot学习(1)第一个SpringBoot程序
  • 什么是热迁移?90%的企业都理解错误
  • Scratch少儿编程案例-丝滑版贪吃蛇
  • Linux系统之网卡子接口配置方法
  • 2023上半年软考中级系统集成项目管理工程师2月25日开班
  • YOLO-V5轻松上手
  • CSS的优先级理解
  • 前端工程师leetcode算法面试必备-二分搜索算法(中)
  • 【数据库】MySQL 单表查询,多表查询