首页 > 其他分享 >力扣---833. 字符串中的查找与替换

力扣---833. 字符串中的查找与替换

时间:2023-08-15 21:36:11浏览次数:40  
标签:833 sources int --- 力扣 length str indices targets

你会得到一个字符串 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] 仅由小写英文字母组成

 

题目明确说明不会发生重复冲突,所以可以直接将字符串 s 从前往后遍历,不断将遍历到的字符加入答案,或者将满足条件的字符替换成新的字符,然后加入答案。

所以重要点就是:如何得知遍历到某个位置后是否需要进行置换。

两种思路:

1. 将 indices 进行排序,由于题目明确说了不会重复,所以用一个变量存储当前遍历 indices 数组的位置,如果遍历 s 的下标等于该位置,那么不论是否匹配成功,该位置都向后移一位。(匹配不成功的话,也不可能再次出现)。

2. 利用哈希表,将 indices 中的数据进行存储,准确来说,就是代替了排序和遍历 indices 的步骤,其他步骤不变。

方法1:

class Solution {
    public String findReplaceString(String s, int[] indices, String[] sources, String[] targets) {
        int[][] arr = new int[indices.length][];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new int[]{indices[i], i};
        }
        Arrays.sort(arr, (a, b) -> (a[0] - b[0]));
        StringBuilder str = new StringBuilder();
        int index = 0;
        for (int i = 0; i < s.length(); i++) {
            if (index < arr.length && i == arr[index][0]) {
                int j = arr[index][1];
                if (s.startsWith(sources[j], i)) {
                    str.append(targets[j]);
                    i += sources[j].length() - 1;
                } else {
                    str.append(s.charAt(i));
                }
                index++;
            } else {
                str.append(s.charAt(i));
            }
        }
        return str.toString();
    }
}

 方法二:

class Solution {
    public String findReplaceString(String s, int[] indices, String[] sources, String[] targets) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < indices.length; i++) {
            map.put(indices[i], i);
        }
        StringBuilder str = new StringBuilder();
        // 遍历字符串 s
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(i)) {
                int j = map.get(i);
                if (s.startsWith(sources[j], i)) {
                    str.append(targets[j]);
                    i += sources[j].length() - 1;
                } else {
                    str.append(s.charAt(i));
                }
            } else {
                str.append(s.charAt(i));
            }
        }
        return str.toString();
    }
}

 

标签:833,sources,int,---,力扣,length,str,indices,targets
From: https://www.cnblogs.com/allWu/p/17632496.html

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
    一、如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢?文心一言:在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现。期望运行时间考虑了所有可能的情况,包括输入数据的分布和随机性等因素。对于随机化算法,最坏情况下的......
  • 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
    一、如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢?文心一言:在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现。期望运行时间考虑了所有可能的情况,包括输入数据的分布和随机性等因素。对于随机化算法,最坏情况下的运行......
  • BBS-注册功能
    注册功能注册功能页面搭建:<body><divclass="container"><divclass="row"><divclass="col-md-8col-md-offset-2"><h1class="text-center">注册页面</h1><d......
  • Linux安装Solr-8.9.0
    Solr的工作原理可以简单地概括为以下几个步骤:1.索引创建:首先,Solr需要创建一个索引,用于存储要搜索的数据。索引是基于ApacheLucene构建的,它将文档拆分为字段,并对字段进行分析和标记化,以便进行更有效的搜索和匹配。2.数据导入:Solr可以从多种数据源导入数据,包括数据库、文件、Web......
  • PyTorch神经网络工具箱-新手笔记
    神经网络核心组件利用PyTorch神经网路工具箱设计神经网络就像搭积木一样,可以极大简化构建模型的任务。神经网络核心组件如下:层:神经网络的基本结构,将输入张量转换为输出张量。模型:由层构成的网络。损失函数:参数学习的目标函数,通过最小化损失函数来学习各种参数。优化器:如在使损失值......
  • 14 观察者模式 -- go语言设计模式
    观察者模式也叫做发布-订阅模式。观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到它订阅的通知。观察者模式的实现代码packagemainimport"fmt"//---------抽象层--------//抽象的观察者typeListenerinterface{ OnTe......
  • 设计模式-行为型模式
    ⾏为模式:负责对象间的⾼效沟通和职责传递委派。PS:博客根据it老齐大话设计模式课程课件进行整理,IT老齐视频学习网站:https://www.itlaoqi.com包含的设计模式:策略模式、模板⽅法模式、观察者模式、迭代⼦模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模......
  • 我的灵感爆棚-1.以往的
    目录前言前言从高中开始,爱上hiphop;不久之后,爱上了band;善变的人,善变的心。错落的霓虹灯下,几个孤单的游走着本是繁华的城市,匆匆来来又去去啊看似拥挤,嘈杂与喧闹并存在这外壳下,人们的心都没在接近就你看我,我看你,交换过眼神后是麻木的感受为何没有用微笑去对待也是没......
  • Syline6.5学习心得-web-创建几何对象
    通过实例说明如何在Skyline中创建圆、文本、多边形等几何要素,设置要素的颜色,要素提示,飞行到几何要素等功能。1.使用的接口    ICreator65:可以创建几何要素、颜色、位置、图层等等(具体请查看api)例如本篇所涉及的要素:CreatePosition,CreateColor,CreateCircle,CreateMessage......
  • [代码随想录]Day18-二叉树part07
    题目:530.二叉搜索树的最小绝对差思路:一个关键问题——BST的中序遍历是由小到大的顺序,也就是说记录遍历的前一个节点,每次比较当前节点-前一个节点的值即可(因为由小到大所以当前>前一个)代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Val......