1208. 尽可能使字符串相等

Problem: 1208. 尽可能使字符串相等

题目描述

给定两个相同长度的字符串 st,将字符串 s 转换为字符串 t 需要消耗开销,开销是两个字符的 ASCII 码差值的绝对值。还有一个最大预算 maxCost,我们需要在这个预算范围内,找到 s 中能够转换为 t 的最长子字符串,返回这个子字符串的长度。

示例

示例 1:

输入:s = "abcd", t = "bcdf", maxCost = 3
输出:3
解释:将 "abc" 变为 "bcd" 的总开销为 3,所以最长可转换子字符串长度为 3。

示例 2:

输入:s = "abcd", t = "cdef", maxCost = 3
输出:1
解释:每个字符的转换开销都为 2,因此只能转换单个字符。

代码实现

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {int n = s.length(), ans = 0, left = 0;int window = 0;for (int right = 0; right < n; right++) {int c = abs(s[right] - t[right]);  // 计算当前字符转换开销window += c;  // 累计窗口内的总开销// 当总开销超过 maxCost 时,移动左指针缩小窗口while (window > maxCost) {window -= abs(s[left] - t[left]);  // 移除左边的开销left++;}// 更新最大可转换子字符串的长度ans = max(ans, right - left + 1);}return ans;}
};

题解

1. 解题思路

这道题可以用滑动窗口来解决。滑动窗口是一种常见的算法思想,它通过动态调整窗口的大小来解决问题。具体步骤如下:

  • 使用两个指针 leftright 来表示窗口的左右边界,left 是窗口的起点,right 是窗口的终点。
  • 在遍历字符串的过程中,不断累加从 s 转换到 t 的字符开销。
  • 如果当前窗口内的总开销超过了 maxCost,则移动 left 指针缩小窗口,直到总开销重新符合条件。
  • 在每次符合条件时,计算并更新当前可转换的最大子字符串长度。
2. 变量解释
  • n: 字符串 st 的长度,假设两者长度相同。
  • left: 滑动窗口的左边界,用来控制窗口缩小。
  • right: 滑动窗口的右边界,用来控制窗口扩大。
  • window: 记录当前窗口内的转换开销总和。
  • c: 当前窗口中 s[right] 转换为 t[right] 的开销,即 abs(s[right] - t[right])
  • ans: 最终的答案,表示最长的可转换子字符串长度。
3. 滑动窗口详解

滑动窗口的核心在于:

  • 当总开销 window 小于等于 maxCost 时,我们可以扩大窗口的右边界 right,并更新当前窗口的长度。
  • 当总开销 window 超过 maxCost 时,需要移动左边界 left,缩小窗口,直到开销重新回到预算范围内。

通过这种方式,我们可以在 O(n) 的时间复杂度下完成遍历,并且只使用了常量空间 O(1),因此该解法非常高效。

4. 代码逻辑解析
  • 首先初始化 leftright 指针,window 用于记录当前窗口的总开销。
  • for 循环中,遍历字符串的每一个字符,计算转换的开销,并更新 window
  • 如果 window 超过了 maxCost,通过 while 循环移动 left 指针,缩小窗口,并减少开销。
  • 每次窗口有效时,更新最大可转换子字符串的长度。

时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次(一次进入窗口,一次离开窗口)。
  • 空间复杂度:O(1),只使用了常数空间来记录窗口的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时钟分频电路之Innovus自动产生的_clock_gen skew group盘点

我们在查看时钟树综合的log时会发现工具会自动生成一些skew group&#xff0c;这些skew group的名字都是以_clock_gen开头的。 skew_group _clock_gen_CLK_CORE_PLL_clk_reg_1/func: insertion delay [min0.020, max0.064, avg0.038, sd0.022], skew [0.045 vs 0.050], 100% {…

SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤

申请免费的SSL证书通常可以通过以下几个步骤完成&#xff0c;这里以使用JoySSL为例进行说明&#xff0c;因为JoySSL提供了一个免费、自动化和开放的证书颁发机构&#xff08;CA&#xff09;来促进网站从HTTP向HTTPS的转换。 步骤&#xff1a; 选择工具&#xff1a; 访问JoySSL…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse&#xff0c;为了避免Hive还要清洗数据&#xff0c;因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse&#xff1a;clickhouse-client-21.9.5.16 Kettle&#xff1a;kettle9.2 Hadoop&#xff1a;hadoop-3.1.3…

汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火

故障现象  一辆2019款奥迪A6L车&#xff0c;搭载2.0T发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;车辆行驶中偶发熄火&#xff0c;故障频率较高。 故障诊断  接车后试车&#xff0c;起动发动机&#xff0c;可以正常起动着机。使用故障检测仪检测&#x…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具&#xff0c;Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后&#xff0c;你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue&#xff0c;看看是否展示出了一份所有可用命令的…

基于SSM邮票鉴赏系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;邮票信息管理&#xff0c;邮票分类管理&#xff0c;文章信息管理&#xff0c;系统管理&#xff0c;个人分享管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&…

【正点原子K210连载】第四十八章 自学习分类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十八章 自学习分类实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了MNIST的手写数据识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的自学习分类。通过本章的学习&#xff0c;读者将学习到自学习分类应用在CanMV上的实现。 本章分为如下几个小节&#xf…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文&#xff1a;https://arxiv.org/abs/2410.07718 代码&#xff1a;https://github.com/fudan-generative-vision/hallo2 模型&#xff1a;https://huggingface.co/fudan-generative-ai/h…

后端C++

前言 1. Task0 1.1 获取你的服务器 1.2 对服务器进行基本操作 分别创建文件夹dir_a, dir_b, dir_c进入dir_a,创建a.txt, b.txt, c.txt 将a.txt, b.txt, c.txt 分别复制成: a.txt.bak, b.txt.bak, c.txt.bak 将a.txt, b.txt, c.txt 分别重命名为: a_new.txt, b_new.txt, c_ne…

凹凸性和拐点的概念

二阶导不存在也可能是拐点 判断拐点的充分条件

Android Studio USB调试真机映射屏幕画面

Android Studio USB调试真机映射屏幕画面 文章目录 Android Studio USB调试真机映射屏幕画面一、USB连手机并设置开发者模式1.1 报错信息1.2 启用开发者选项和 USB 调试&#xff1a;1.3 手机配置选项 二、Android Studio 开启手机投屏功能 一、USB连手机并设置开发者模式 1.1 …

Flutter 小技巧之 equatable 包解析以及宏编程解析

今天我们聊聊 equatable 包的实现&#xff0c;并通过 equatable 去理解 Dart 宏编程的作用和实现&#xff0c;对于 Flutter 开发者来说&#xff0c;Dart 宏编程可以说是「望眼欲穿」。 equatable 正如 equatable 这个包名所示&#xff0c;它的功能很简单&#xff0c;主要是用…

计算机毕业设计hadoop+spark知识图谱中药推荐系统 中药材推荐系统 中药可视化 中药数据分析 中药爬虫 机器学习 深度学习 人工智能 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 摘 要 本文所探讨的领域是…

【Linux】“echo $变量“ 命令打印变量值的底层原理

在 shell 中&#xff0c;echo $变量 命令的工作原理涉及几个关键步骤&#xff0c;主要是由 shell 解释器来处理变量的查找和替换。以下是详细的过程&#xff1a; 变量展开的过程顺序 变量引用&#xff1a; 在命令行中&#xff0c;变量通常以 $variable_name 或 ${variable_…

若依前后端分离超详情版

若依系统安装流程 1.安装Ubuntu系统 1.1 新建虚拟机 打开VMware Workstation&#xff0c;选择文件->新建虚拟机->典型&#xff08;推荐T&#xff09;->安装程序光盘映像文件->输入虚拟的名字->一直下一步即可 安装程序光盘映像文件 注意&#xff1a;选择ub…

专业第三方的控价价值

在当今竞争激烈的商业世界中&#xff0c;价格管控犹如一场没有硝烟的战争。品牌们为了维护自身的市场秩序和品牌价值&#xff0c;纷纷踏上控价的艰难征程。而在这个过程中&#xff0c;专业的第三方控价服务公司正以创新之姿&#xff0c;成为品牌们的得力助手。 曾经&#xff0c…

空间数据分析实验04:空间统计分析

实验概况 实验目的 了解空间统计分析的基本原理掌握空间统计分析的常用方法 实验内容 根据某村的土地利用数据和DEM数据&#xff0c;提取各村组耕地面积比例&#xff0c;并将其与村组平均坡度进行相关性分析&#xff0c;最后计算各村组单元的景观多样性指数。 实验原理与方…

【设计模式-原型】

**原型模式&#xff08;Prototype Pattern&#xff09;**是一种创建型设计模式&#xff0c;旨在通过复制现有对象的方式来创建新对象&#xff0c;而不是通过实例化类来创建对象。该模式允许对象通过克隆&#xff08;复制&#xff09;来创建新的实例&#xff0c;因此避免了重新创…

你不常用的 FileReader 能干什么?

前言 欢迎关注同名公众号《熊的猫》&#xff0c;文章会同步更新&#xff0c;也可快速加入前端交流群&#xff01; 本文灵感源于上周小伙伴遇到一个问题&#xff1a; “一个本该返回 Blob 类型的下载接口&#xff0c;却返回了 JSon 类型的内容&#xff01;&#xff01;&#xf…

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…