【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-排序模擬

文章目錄

  • Find And Replace in String 字符串中的查找與替換

Find And Replace in String 字符串中的查找與替換

問題描述:

你會得到一個字符串 s (索引從 0 開始),你必須對它執行 k 個替換操作。替換操作以三個長度均為 k 的并行數組給出:indices, sources, 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 . l e n g t h < = 1000 k = = i n d i c e s . l e n g t h = = s o u r c e s . l e n g t h = = t a r g e t s . l e n g t h 1 < = k < = 100 0 < = i n d i c e s [ i ] < s . l e n g t h 1 < = s o u r c e s [ i ] . l e n g t h , t a r g e t s [ i ] . l e n g t h < = 50 s 僅由小寫英文字母組成 s o u r c e s [ i ] 和 t a r g e t s [ i ] 僅由小寫英文字母組成 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] 僅由小寫英文字母組成 1<=s.length<=1000k==indices.length==sources.length==targets.length1<=k<=1000<=indices[i]<s.length1<=sources[i].length,targets[i].length<=50s僅由小寫英文字母組成sources[i]targets[i]僅由小寫英文字母組成

分析

模擬類型的問題

直接的想法就是依次遍歷,遇到一個索引,進行比較,如果于 s o u r c e [ i ] source[i] source[i]相同,就要替換成為 t [ i ] t[i] t[i].

當遇到索引 i d x = i n d [ i ] idx= ind[i] idx=ind[i] l s = s o u r c e [ i ] . l e n g t h ls = source[i].length ls=source[i].length.即 s [ i d x : i d x + l s ? 1 ] = = s o u r c e [ i ] s[idx:idx+ls-1]==source[i] s[idx:idx+ls?1]==source[i]是否相等。

  • 如果相等, s [ i d x : i d x + l s ? 1 ] s[idx:idx+ls-1] s[idx:idx+ls?1]就需要被替換。因為有限制,所以不會出現重疊的現象。此時 s [ i d x + l s ] s[idx+ls] s[idx+ls]就是未被替換的字符位置,它和下一個待比較的索引位置的關系一定是 i d x + l s < = n e x t i d x idx+ls<=nextidx idx+ls<=nextidx.

所以在2個待比較的索引之間未被替換的字符串的長度是>=0,這一部分就需要加入到結果中。

  • 如果不相等,那么 s [ i d x : n e x t i d x ? 1 ] s[idx:nextidx-1] s[idx:nextidx?1]的字符串就會全部加入結果中。

模擬

這個思路是以待比較的索引從小到大的排列,并且以索引數組為遍歷目標,進行模擬

因此需要對原始的三個數組,進行預處理,即進行索引排序

代碼

排序模擬

class Solution {public String findReplaceString(String s, int[] indices, String[] sources, String[] targets) {StringBuilder sb = new StringBuilder();char[] arr = s.toCharArray();int n = indices.length;int len = arr.length;Integer[] indarr = new Integer[n];for(int i=0;i<n;i++) indarr[i] =i;Arrays.sort(indarr,(a,b)->{return indices[a]-indices[b];});int end = 0;for(int i=0;i<n;i++){int idx = indices[indarr[i]];String s1 = sources[indarr[i]];String t1 = targets[indarr[i]];int l1 = s1.length(); if(check(idx,arr,s1)){if(end<idx){ sb.append(s.substring(end,idx));} sb.append(t1);end = idx+l1;}else{int nx = i+1<n?indices[indarr[i+1]]:len;if(idx==nx) continue; sb.append(s.substring(end,idx));sb.append(s.substring(idx,nx));end = nx;} } if(end<len)sb.append(s.substring(end,len));return sb.toString();}public boolean check(int idx,char[] arr,String s){int ls = s.length(),n = arr.length;int l1 = n-idx; if(l1<ls) return false;int ind =0;for(int i = idx;i<idx+ls;i++,ind++){             if(arr[i]!=s.charAt(ind)) return false;  }return true;  }
}

時間復雜度 O ( N + M l o g M ) O(N+MlogM ) O(N+MlogM)

空間復雜度 O ( N + M L ) O(N+ML) O(N+ML)

還有一種線性的思路,S的長度是N,那么就有可能會在N個位置上進行替換操作。有空再寫

Tag

Array

Sort

String

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker通用鏡像方法,程序更新時不用重新構建鏡像

docker通用鏡像方法&#xff0c;程序更新時不用重新構建鏡像。更新可執行文件后&#xff0c;重新啟動容器就可運行。 功能 1、在demo目錄下添加腳本文件start.sh&#xff0c;里面執行demo.jar文件。 2、將demo目錄映射到鏡像下的 /workspace目錄。 3、Dockerfile文件中默認…

如何在Linux中強制關閉卡住的PyCharm

在使用PyCharm進行Python開發時&#xff0c;有時可能會遇到卡頓或無響應的情況。當PyCharm卡住時&#xff0c;我們需要強制關閉它以恢復正常操作。今天&#xff0c;我們將介紹在Linux系統中如何強制關閉PyCharm的幾種方法。 1. 使用鍵盤快捷鍵 在PyCharm所在的窗口中&#xf…

臺灣shopee:蝦皮電商平臺選品方法與市場機遇

臺灣Shopee蝦皮電商平臺為臺灣本土賣家和消費者提供了一個線上交易平臺。對于想要在臺灣市場做蝦皮電商的賣家來說&#xff0c;選擇合適的產品是非常重要的。本文介紹一些做蝦皮電商的選品方法和策略。 首先&#xff0c;了解市場需求是選品的基礎。在進入臺灣Shopee市場之前&a…

【Spring專題】Spring之Bean的生命周期源碼解析——階段二(IOC之實例化)

目錄 前言閱讀準備閱讀指引閱讀建議 課程內容一、SpringIOC之實例化1.1 簡單回顧1.2 概念回顧1.3 核心方法講解 二、方法講解2.1 AbstractBeanFactory#getMergedLocalBeanDefinition&#xff1a;合并BeanDefinition2.2 AbstractAutowireCapableBeanFactory#createBean&#xff…

oracle修改臨時表出現已使用的事務正在處理臨時表問題

錯誤提示&#xff1a; ORA-14450:試圖訪問已經在使用的事務處理臨時表 解決方法&#xff1a; 通過第一句sql來查找臨時表的object_id &#xff0c;然后代入第二局sql來生成第三句sql語句。 最后再執行第三句sql語句即可kill session&#xff0c;執行修改表的操作。 SELECT * F…

華為OD機試-射擊比賽成績

題目描述 射擊比賽成績統計 給定一個射擊比賽成績單 包含多個選手若干次射擊的成績分數 請對每個選手按其最高三個分數之和進行降序排名 輸出降序排名后的選手ID序列 條件如下: 一個選手可以有多個射擊成績的分數 且次序不固定 如果一個選手成績小于三個 則認為選手的所有成績…

【Go 基礎篇】Go語言基本數據類型轉換:字符串、整數、浮點數、字符與布爾類型的轉換

介紹 在計算機編程中&#xff0c;不同的數據類型用于表示不同種類的數據。在Go語言&#xff08;Golang&#xff09;中&#xff0c;基本數據類型包括字符串、整數、浮點數、字符和布爾類型。在實際開發中&#xff0c;經常需要進行不同數據類型之間的轉換&#xff0c;以滿足不同…

安達發APS|APS排產軟件之計劃甘特圖

在當今全球化和競爭激烈的市場環境下&#xff0c;制造業企業面臨著巨大的壓力&#xff0c;如何在保證產品質量、降低成本以及滿足客戶需求的同時&#xff0c;提高生產效率和競爭力成為企業需要迫切解決的問題。在這個背景下&#xff0c;生產計劃的制定和執行顯得尤為重要。然而…

2023年京東按摩儀行業數據分析(京東銷售數據分析)

近年來&#xff0c;小家電行業憑借功能與顏值&#xff0c;取代黑電和白電&#xff0c;成為家電市場的主要增長點。在這一市場背景下&#xff0c;顏值更高、功能更豐富、品種更齊全的各類按摩儀&#xff0c;借助新消費和電子商務的風潮&#xff0c;陸續被推上市場。今年&#xf…

【Cocos Creator 項目實戰 】消滅星星加強版(附帶完整源碼工程)

本文乃Siliphen原創&#xff0c;轉載請注明出處 目錄 概述 游戲整體流程 游戲框架設計 單一職責的類 主要流程控制類 核心玩法模塊 UI&#xff1a; 游戲世界&#xff1a; 本文項目的代碼組織結構 作者項目實踐總結 場景只有一個入口腳本 盡量少在節點上掛載腳本 構…

從零構建深度學習推理框架-8 卷積算子實現

其實這一次課還蠻好理解的&#xff1a; 首先將kernel展平&#xff1a; for (uint32_t g 0; g < groups; g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k 0; k < k…

macOS(m芯片)連接服務器及其進行文件傳輸的各種方式的詳解

說明&#xff1a;使用了macOS后發現&#xff0c;win系統能使用的xshell、xftp等連接服務器及其文件傳輸等軟件均不能使用了&#xff0c;沒有兼容的版本。所以我們剛切換到mac系統該如何去適應呢。 一、連接遠程服務器 macOS中前文也說道我們使用的是iterm2進行終端控制的&…

基于深度信念神經網絡的礦石產量預測,基于DBN的礦石產量預測,DBN的詳細原理

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) DBN的礦石產量預測 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類算法,本文將DBN算法進行礦石產量預測 DB…

Spring Boot Maven package時顯式的跳過test內容

在pom.xml的編譯插件部分顯式的增加一段內容&#xff1a; <plugin> <!-- maven打包時&#xff0c;顯式的跳過test部分 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.…

流量日志分析--實操

[鶴城杯 2021]流量分析 <--第一道流量分析不難,主要就是布爾盲注的流量包分析,直接查看http請求包即可我們可以通過觀察看到注入成功的響應長度不同,這里成功的為978字節,失敗的994字節.不要問為什么.其實也可以直接判斷.978的流量比994的少了非常多 顯然就是成功的(因為這里…

Docker中部署redis

1.部署redis要求 2.部署教程 連接容器中的redis redis部署完畢

大模型基礎:GPT家族與提示學習

大模型基礎:GPT 家族與提示學習 從 GPT-1 到 GPT-3.5 GPT(Generative Pre-trained Transformer)是 Google 于2018年提出的一種基于 Transformer 的預訓練語言模型。它標志著自然語言處理領域從 RNN 時代進入 Transformer 時代。GPT 的發展歷史和技術特點如下: GPT-12018年6月…

QQ附近人引流的幾個詳細方法,qq附近人引流腳本實操演示教程

大家好我是你們的小編一辭腳本&#xff0c;今天給大家分享新的知識&#xff0c;很開心可以在CSDN平臺分享知識給大家,很多伙伴看不到代碼我先錄制一下視頻 在給大家做代碼&#xff0c;給大家分享一下qq引流腳本的知識和視頻演示 不懂的小伙伴可以認真看一下&#xff0c;我們一…

【CSS】CSS 布局——常規流布局

<h1>基礎文檔流</h1><p>我是一個基本的塊級元素。我的相鄰塊級元素在我的下方另起一行。</p><p>默認情況下&#xff0c;我們會占據父元素 100%的寬度&#xff0c;并且我們的高度與我們的子元素內容一樣高。我們的總寬度和高度是我們的內容 內邊距…

Flink筆記

下面是你提供的文字整理后的結果&#xff1a; 1. Flink是一個針對流數據和批數據的分布式處理引擎&#xff0c;同時支持原生流處理的開源框架。 - 延遲低(毫秒級)&#xff0c;且能夠保證消息傳輸不丟失不重復。 - 具有非常高的吞吐(每秒千萬級)。 - 支持原生流處理。…