​LeetCode解法汇总833. 字符串中的查找与替换

news/2025/3/21 1:18:09/

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indicessources,  targets

要完成第 i 个替换操作:

  1. 检查 子字符串  sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。
  2. 如果没有出现, 什么也不做 。
  3. 如果出现,则用 targets[i] 替换 该子字符串。

例如,如果 s = "abcd" , indices[i] = 0 , sources[i] = "ab", targets[i] = "eee" ,那么替换的结果将是 "eeecd" 。

所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 

  • 例如,一个 s = "abc" ,  indices = [0,1] , sources = ["ab","bc"] 的测试用例将不会生成,因为 "ab" 和 "bc" 替换重叠。

在对 s 执行所有替换操作后返回 结果字符串 。

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = "abcd", indices = [0,2], sources = ["a","cd"], targets = ["eee","ffff"]
输出:"eeebffff"
解释:
"a" 从 s 中的索引 0 开始,所以它被替换为 "eee"。
"cd" 从 s 中的索引 2 开始,所以它被替换为 "ffff"。

示例 2:

输入:s = "abcd", indices = [0,2], sources = ["ab","ec"], targets = ["eee","ffff"]
输出:"eeecd"
解释:
"ab" 从 s 中的索引 0 开始,所以它被替换为 "eee"。
"ec" 没有从原始的 S 中的索引 2 开始,所以它没有被替换。

提示:

  • 1 <= s.length <= 1000
  • k == indices.length == sources.length == targets.length
  • 1 <= k <= 100
  • 0 <= indices[i] < s.length
  • 1 <= sources[i].length, targets[i].length <= 50
  • s 仅由小写英文字母组成
  • sources[i] 和 targets[i] 仅由小写英文字母组成

解题思路:

* 833. 字符串中的查找与替换

* 解题思路:

* 首先,把indices,sources,targets融合成一个数组list,按照indices的大小排序。

* 然后遍历这个,尝试使用list中indices的值去查找,看对应的位置是否匹配,如果匹配,则需要插入两部分:

* 1.indice之前的部分。

* 2.替换为targets的部分。

* 然后更新index为当前位置即可。

* 如果不匹配,则无需更新,因为下次的成功匹配会填充index到当前匹配位置所有的值。

代码:

class Solution833
{
public:string findReplaceString(string s, vector<int> &indices, vector<string> &sources, vector<string> &targets){vector<pair<int, pair<string, string>>> list;for (int i = 0; i < indices.size(); i++){list.push_back(make_pair(indices[i], make_pair(sources[i], targets[i])));}sort(list.begin(), list.end(), [](pair<int, pair<string, string>> pair1, pair<int, pair<string, string>> pair2){ return pair2.first - pair1.first > 0; });string out;int index = 0;for (auto item : list){// 如果相同,则填入替换的string olds = s.substr(item.first, min(item.second.first.size(), s.size() - item.first));if (olds == item.second.first){out.append(s.substr(index, item.first - index));out.append(item.second.second);index = item.first + item.second.first.size();}}out.append(s.substr(index, s.size() - index));return out;}
};


http://www.ppmy.cn/news/1039285.html

相关文章

地毯(暴力+差分两种方法)

题目描述 在 nx n 的格子上有 m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个正整数 n,m。意义如题所述。 接下来 m 行&#xff0c;每行两个坐标 (x_1,y_1) 和 (x_2,y_2)&#xff0c;代表一块地毯&#xff0c;左上…

Kotlin Lambda和高阶函数

Lambda和高阶函数 本文链接&#xff1a; 文章目录 Lambda和高阶函数 lambda输出&#xff08;返回类型&#xff09;深入探究泛型 inline原理探究 高阶函数集合、泛型自己实现Kotlin内置函数 扩展函数原理companion object 原理 > 静态内部类函数式编程 lambda 1、lambda的由…

HJ3 明明的随机数

题目链接 难度&#xff1a;简单 题解&#xff1a; 题目思路&#xff1a;定义一个长度为510的数组来表示输入的每个数字是否出现过。 数组的下标表示输入的数字本身。 数组的值为1&#xff0c;表示已出现。 数组的值为0&#xff0c;表示未出现。 最后顺序遍历数组&#xff0c…

Esp8266学习7. 点亮JMD0.96C-1 OLED屏

Esp8266学习7. 点亮JMD0.96C-1 OLED屏 一、ESP32-C3 I2C资源简介1. 简介2. 准备工作 二、I2C协议简介1. 起始条件&#xff08;Start Condition&#xff09;&#xff1a;2. 设备地址传输&#xff08;Device Address Transmission&#xff09;&#xff1a;3. 从设备响应&#xff…

数据结构单链表

单链表 1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 。 在我们开始讲链表之前&#xff0c;我们是写了顺序表&#xff0c;顺序表就是类似一个数组的东西&#xff0…

手撕单链表

目录 链表的概念和结构 单链表的实现 申请新结点 打印 尾插 头插 尾删 头删 ​编辑 查找 在pos位置前插入元素 在pos位置后插入元素 删除pos位置的元素 删除pos位置之后的位置的元素​编辑 完整代码 SListNode.h SListNode.c 链表的概念和结构 链表是一种物理存储…

C++新经典03--共用体、枚举类型与typedef

共用体 共用体&#xff0c;也叫联合&#xff0c;有时候需要把几种不同类型的变量存放到同一段内存单元&#xff0c;例如&#xff0c;把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同&#xff0c;但它们都从同…

【Go 基础篇】Go语言基本数据类型转换:字符串、整数、浮点数、字符与布尔类型的转换

介绍 在计算机编程中&#xff0c;不同的数据类型用于表示不同种类的数据。在Go语言&#xff08;Golang&#xff09;中&#xff0c;基本数据类型包括字符串、整数、浮点数、字符和布尔类型。在实际开发中&#xff0c;经常需要进行不同数据类型之间的转换&#xff0c;以满足不同…