【算法-字符串2】替換空格 + 反轉單詞

今天,帶來字符串相關算法的講解。文中不足錯漏之處望請斧正!

理論基礎點這里


1. 替換空格

題目描述:請實現一個函數,把字符串 s 中的每個空格替換成"%20"。
來源:力扣(LeetCode)
難度:簡單
提示:
0 <= s 的長度 <= 10000
示例 1:
輸入:s = “We are happy.” 輸出:“We%20are%20happy.”

題意轉化

把字符串內的所有' '替換為%20.

解決思路(抽象)

使用額外空間

創建一個空字符串, 遍歷給定字符串s, 遇到字符的時候直接插入空字符串, 遇到空格的時候插入%20.

不使用額外空間

不用額外空間就要擴容:統計空格個數,每個空格替換成“%20”,就意味著每個空格都需要額外兩個字符的空間。

擴容后,從后向前替換

為什么是從后向前?因為從前向后替換數組元素,每次替換完都要把后面所有元素往后移動,這就是O(n^2)的復雜度了。

編程實現(具體)

使用額外空間

class Solution {
public:string replaceSpace(string s) {string ret;for(char &ch : s) {if(ch == ' ') ret += "%20";else ret += ch;}return ret;}
};

不使用額外空間

class Solution {
public:string replaceSpace(string s) {// 擴容int count = 0; //空格個數for(char &ch : s) if(ch == ' ') ++count;int oldSize = s.size();s.resize(s.size() + count * 2);int newSize = s.size();// 從后向前替換for(int i = oldSize - 1, j = newSize - 1; i < j; --i, --j) {if(s[i] != ' ') {s[j] = s[i];} else {s[j] = '0';s[j - 1] = '2';s[j - 2] = '%';j -= 2; //多了兩次操作,j指針對應移動}}return s;}
};

2. 反轉單詞

給你一個字符串 s ,請你反轉字符串中 單詞 的順序。

單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。

返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。

注意:輸入字符串 s中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字符串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。

示例 1:

輸入:s = “the sky is blue”
輸出:“blue is sky the”
示例 2:

輸入:s = " hello world "
輸出:“world hello”
解釋:反轉后的字符串中不能存在前導空格和尾隨空格。
示例 3:

輸入:s = “a good example”
輸出:“example good a”
解釋:如果兩個單詞間有多余的空格,反轉后的字符串需要將單詞間的空格減少到僅有一個。

提示:

1 <= s.length <= 104
s 包含英文大小寫字母、數字和空格 ’ ’
s 中 至少存在一個 單詞

進階:如果字符串在你使用的編程語言中是一種可變數據類型,請嘗試使用 O(1) 額外空間復雜度的 原地 解法。

題意轉化

返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串.

解決思路(抽象)

首先, 要保證單詞之間用單個空格連接(頭尾沒有空格).

原地處理的話, 可以使用雙指針重新填充字符串:

  • fast:遍歷s拿字符(遇到空格就跳過)
  • slow:從頭填充合法字符串

簡單說, 每次遇到空格就自己把單詞填充上, 再手動添加一個空格, 就可以滿足題目要求.

單詞順序顛倒, 我們無法直接實現, 但我們能做什么?

  • 顛倒字符串順序
  • 顛倒單個單詞順序

前者就可以顛倒單詞順序, 只不過會讓單個單詞也顛倒, 我們再次顛倒每個單詞, 不就得到了題目要求的字符串了嗎.
比如 如 hello world , 整體反轉后是 dlrow olleh;然后對單詞反轉 world hello .
簡單說, 先總體反轉, 再局部反轉.

編程實現(具體)

最后一個單詞, 可以在反轉單詞內部順序的循環中處理, 也可以跳出循環單獨處理.

最后一個單詞反轉單詞內部順序的循環中處理:

class Solution {
public:string reverseWords(string s) {//雙指針重新填充字符串int slow; // 填充字符串int fast; // 遍歷sfor (slow = 0, fast = 0; fast < s.size(); ++fast) {if (s[fast] == ' ') continue; // 如果是空格就跳過// 填充當前單詞while (fast < s.size() && s[fast] != ' ') s[slow++] = s[fast++];// 填充空格(只有最后一個單詞后不需要填充)s[slow++] = ' ';}s.resize(slow - 1); // 去掉多余的空格(最后一個單詞后不需要填充, 但我們默認填充了)cout << "處理后的字符串: " << s << endl;// 整體反轉reverse(s.begin(), s.end());// 局部反轉int wordBegin = 0;int wordEnd= 0;while (wordEnd <= s.size()) {if (s[wordEnd] == ' ' || wordEnd == s.size()) {reverse(s.begin() + wordBegin, s.begin() +wordEnd);wordBegin = wordEnd + 1;wordEnd = wordBegin;}++wordEnd;}return s;}
};

最后一個單詞跳出循環單獨處理:

class Solution {
public:string reverseWords(string s) {//雙指針重新填充字符串int slow; // 填充字符串int fast; // 遍歷sfor (slow = 0, fast = 0; fast < s.size(); ++fast) {if (s[fast] == ' ') continue; // 如果是空格就跳過// 填充當前單詞while (fast < s.size() && s[fast] != ' ') s[slow++] = s[fast++];// 填充空格(只有最后一個單詞后不需要填充)s[slow++] = ' ';}s.resize(slow - 1); // 去掉多余的空格(最后一個單詞后不需要填充, 但我們默認填充了)cout << "處理后的字符串: " << s << endl;// 整體反轉reverse(s.begin(), s.end());// 局部反轉int wordBegin = 0;int wordEnd= 0;while (wordEnd < s.size()) {if (s[wordEnd] == ' ') {reverse(s.begin() + wordBegin, s.begin() +wordEnd);wordBegin = wordEnd + 1;wordEnd = wordBegin;}++wordEnd;}reverse(s.begin() + wordBegin, s.begin() +wordEnd); // 反轉最后一個單詞return s;}
};

今天的分享就到這里了,感謝您能看到這里。

這里是培根的blog,期待與你共同進步!

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

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

相關文章

Lettuce使用詳解

簡介特點連接池連接池特點連接池管理連接池優勢連接池配置參數 監控常用監控工具通過JMX監控通過Prometheus監控 代碼示例拓展springboot中通過jmx上報到Prometheus代碼示例更多Redis相關內容 簡介 Lettuce 是一個高級的、線程安全的 Redis 客戶端&#xff0c;用于與 Redis 數…

深度學習基礎概念

1. 神經網絡基礎 神經元&#xff08;Neuron&#xff09;&#xff1a; 了解神經網絡的基本組成單元。激活函數&#xff08;Activation Function&#xff09;&#xff1a; 學習常見的激活函數&#xff0c;如Sigmoid、ReLU等&#xff0c;以及它們在神經網絡中的作用。前饋神經網絡…

An issue was found when checking AAR metadata

一、報錯信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …

Python 異步套接字編程

異步套接字編程是異步編程在網絡通信中的應用&#xff0c;它使用異步 IO 操作和事件循環來實現高并發的網絡應用。Python 中的 asyncio 模塊提供了對異步套接字編程的支持&#xff0c;以下是異步套接字編程的一些重要概念和使用方法&#xff1a; 1. 異步套接字服務器&#xff…

git與ssh多賬戶共存

git與ssh多賬戶共存 前言git多賬戶ssh多公鑰參考 前言 在使用git與ssh時&#xff0c;經常會遇到多個賬戶共存的情況 例如使用不同的公鑰登陸到不同的服務&#xff1b;使用不同的git信息進行commit git多賬戶 在默認情況下 git的信息存在 ~/.gitconfig 可以使用命令查看 git…

關于elementui和ant design vue無法禁止瀏覽器自動填充問題

以and design vue 為例&#xff1a; 圖標用來顯隱賬號密碼 html&#xff1a; <a-form-model-item label"賬號密碼:" prop"password"><a-input v-if"passwordTab" ref"passwordInput" v-model"form.password" typ…

詳解最長公共子序列問題(三種方法)

這里&#xff0c;為了更方便地解釋&#xff0c;我以洛谷上的一道典型題目為例&#xff0c;為大家講解處理最長公共子序列問題的幾種常見方法。這道題目中規定了兩個子序列的長度相等&#xff0c;如果遇到不等的情況&#xff0c;也只需要對長度稍作修改即可&#xff0c;算法思想…

qs-一個序列化和反序列化的JavaScript庫

起因 一個業務場景中&#xff0c;最終得到一串字符"status[0]value1&status[1]value2" 通過解析&#xff0c;理應得到一個數組&#xff0c;卻得到一個對象 于是展開問題排查 最終發現是qs.parse 這個地方出了問題 排查結果 qs解析這種帶下標的字符串時&#xff…

基于python的NBA球員數據可視化分析的設計與實現

完整下載&#xff1a;基于python的NBA球員數據可視化分析的設計與實現.docx 基于python的NBA球員數據可視化分析的設計與實現 Design and Implementation of NBA Player Data Visualization Analysis based on Python 目錄 目錄 2 摘要 3 關鍵詞 4 第一章 引言 4 1.1 研究背景 …

【Java 進階篇】Redis 命令操作:輕松掌握基本操作

Redis是一款高性能的鍵值對存儲系統&#xff0c;以其快速、靈活的特性而備受開發者推崇。本文將詳細介紹Redis的基本命令操作&#xff0c;包括鍵值操作、數據查詢、事務處理等方面&#xff0c;幫助初學者更好地理解和使用Redis。 基本命令 1. 鍵值操作 1.1 SET&#xff1a;設…

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了兩個地方&#xff0c;承接的是…

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】SLAM(基礎篇)(三)

目錄 前言 移動機器人視覺SLAM回環檢測 01 回環檢測問題描述 02 主流回環檢測方法 2.1 根據路標點先驗信息

【Flink】Standalone運行模式

獨立模式是獨立運行的&#xff0c;不依賴任何外部的資源管理平臺&#xff1b;當然獨立也是有代價的&#xff1a;如果資源不足&#xff0c;或者出現故障&#xff0c;沒有自動擴展或重分配資源的保證&#xff0c;必須手動處理。所以獨立模式一般只用在開發測試或作業非常少的場景…

Ps:參考線

參考線 Guides用于幫助精確地定位圖像或元素&#xff0c;顯示為浮動在圖像上的非打印線&#xff0c;可以移動或移除&#xff0c;還可以臨時鎖定。 Ps 中的參考線可分為三大類&#xff1a;畫布參考線、畫板參考線和智能參考線。 可在“首選項/參考線、網格和切片”中設置參考線的…

C 標準庫 - <stddef.h>和<stdio.h>詳解

目錄 C 標準庫 - 簡介 庫變量 庫宏 實例 C 標準庫 - 簡介 庫變量 庫宏 庫函數 實例 C 標準庫 - <stddef.h> 簡介 <stdio.h> 是 C 語言中的一個標準庫&#xff0c;它提供了一些常用的函數和類型定義&#xff0c;用于處理與大小相關的操作。 庫變量 …

深信服防火墻路由模式開局部署-手把手教學(小白篇)

PS&#xff1a;深信服的設備只有400能夠通過console連接&#xff0c;一般用戶是無法連接的&#xff0c;所以大家不要妄想著從Console連接設備了&#xff0c;開局就通過MANAGE進入Web就可以 接通電源后&#xff0c;開機拿一根網線&#xff0c;一端連接防火墻的MANAGE口&#xf…

uniapp uni.navigateBack返回后刷新頁面數據

方法1: 父頁面設置鉤子函數(onBackPress): 頁面簡介 | uni-app官網 適用于刷新多處數據 onBackPress(options) {this.refreshData(); }, methods:{refreshData: function() {//加載數據}, }, 方法2: 返回加success回調 uni.navigateBack({delta: 1, //返回層數&#xff0…

【C++】泛型編程 ? ( 類模板示例 - 數組類模板 | 容器思想 | 自定義類可拷貝 - 深拷貝與淺拷貝 | 自定義類可打印 - 左移運算符重載 )

文章目錄 一、容器思想1、自定義類可拷貝 - 深拷貝與淺拷貝2、自定義類可拷貝 - 代碼示例3、自定義類可打印 - 左移運算符重載 二、代碼示例1、Array.h 頭文件2、Array.cpp 代碼文件3、Test.cpp 主函數代碼文件4、執行結果 一、容器思想 1、自定義類可拷貝 - 深拷貝與淺拷貝 上…

百戰python02-語言元素

文章目錄 指令與程序變量與類型變量命名變量的使用運算符賦值運算符比較運算符和邏輯運算符練習1:華氏溫度轉換為攝氏溫度練習2:輸入圓的半徑計算計算周長和面積練習3:輸入年份判斷是不是閏年字符串常用操作注:需要對python有基本了解,可查看本作者python基礎專欄,有任何問…

大模型生態新篇章:以AI Agent為引,助企業創新應用落地

文 | 智能相對論 作者 | 沈浪 以聊天機器人、虛擬助手、智能客服等為代表的對話式人工智能 (Conversational AI Agents ) 在具體服務場景中的應用已經十分普遍。今年以來&#xff0c;隨著大模型技術的爆發與加持&#xff0c;對話式AI被市場賦予了更高的期望。 “所有行業都值…