字符串復習

344:反轉字符串

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組?s?的形式給出。

不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。

示例 1:

輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]

注意不能使用額外空間,這里就使用左右雙指針來進行翻轉

class Solution {
public:void reverseString(vector<char>& s) {int l = 0, r = s.size() - 1;while(l < r){char tmp;tmp = s[l];s[l] = s[r];s[r] = tmp;l++;r--;}}
};

541:反轉字符串II

給定一個字符串?s?和一個整數?k,從字符串開頭算起,每計數至?2k?個字符,就反轉這?2k?字符中的前?k?個字符。

  • 如果剩余字符少于?k?個,則將剩余字符全部反轉。
  • 如果剩余字符小于?2k?但大于或等于?k?個,則反轉前?k?個字符,其余字符保持原樣。

示例 1:

輸入:s = "abcdefg", k = 2
輸出:"bacdfeg"

根據題目意思走,步長設置為2k,左右指針的設定上右指針需要判斷右邊的剩余元素是否小于k,只要不小于就正常進行替換,如果小于k,將右指針設置為右邊界并進行替換。

class Solution {
public:string reverseStr(string s, int k) {int n = s.size();for(int i = 0; i < s.size(); i += 2 * k){int l = i, r = min(l + k - 1, n - 1);while(l < r){char tmp = s[l];s[l] = s[r];s[r] = tmp;l++;r--;}}return s;}
};

?54:替換數字

給定一個字符串 s,它包含小寫字母和數字字符,請編寫一個函數,將字符串中的字母字符保持不變,而將每個數字字符替換為number。 例如,對于輸入字符串 "a1b2c3",函數應該將其轉換為 "anumberbnumbercnumber"。

輸入描述

輸入一個字符串 s,s 僅包含小寫字母和數字字符。

輸出描述

打印一個新的字符串,其中每個數字字符都被替換為了number

輸入示例

a1b2c3

輸出示例

anumberbnumbercnumber

?先進行一遍遍歷確定數字個數,然后新建一個合適大小的數組,這里注意開空間的時候為數字個數n*6-n = 5 * n,然后使用前后兩個指針一個指向新數組的末尾,一個指向原數組的末尾,左指針檢測到數字就從右指針開始填充number,不然就將當前元素賦值給當前右指針位置然后一起前移。

#include<bits/stdc++.h>
using namespace std;int main(){string s;cin >> s;int n = s.size();int count = 0;for(int i = 0; i < n; i++){if(s[i] >= '0' && s[i] <= '9'){count++;}}vector<char> new_nums(n + count * 5);for(int i = 0; i < n; i++){new_nums[i] = s[i];}int l = n - 1, r = new_nums.size() - 1;while(l >= 0){if(new_nums[l] >= '0' && new_nums[l] <= '9'){new_nums[r--] = 'r';new_nums[r--] = 'e';new_nums[r--] = 'b';new_nums[r--] = 'm';new_nums[r--] = 'u';new_nums[r--] = 'n';l--;}else{new_nums[r--] = new_nums[l]; l--;}}for(int i = 0; i < new_nums.size(); i++){cout << new_nums[i];}return 0;
}

151:翻轉字符串中的單詞

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

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

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

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

示例 1:

輸入:s = "the sky is blue"
輸出:"blue is sky the"
class Solution {
public: void reverse(string& s, int start, int end){int l = start, r = end;while(l < r){swap(s[l++], s[r--]);}}void removeextrablank(string& s){// 先去除頭部的空白int slow = 0, fast = 0; while(fast < s.size() && s[fast] == ' '){fast++;}// 處理單詞之間多余的空格for(;fast < s.size(); fast++){if(fast - 1 > 0 && s[fast] == ' ' && s[fast - 1] == s[fast]){continue;}else{s[slow++] = s[fast];}}if(slow - 1 > 0 && s[slow - 1] == ' '){s.resize(slow - 1);}else{s.resize(slow);}}string reverseWords(string s) {removeextrablank(s);reverse(s, 0, s.size() - 1);int left = 0;for(int i = 0; i <= s.size(); i++){if(s[i] == ' ' || i == s.size()){reverse(s, left, i - 1);if(i != s.size() - 1){left = i + 1;         }}}return s;}
};

?先進行對冗余空格的處理,使用雙指針來進行,快指針通過while循環越過所有頭部的空格,后續用slow和fast互換完成對空格的覆蓋,然后對單詞間的冗余空格進行處理,還是同樣的操作當判斷連續兩個空格以上的時候使用continue越過冗余的空格,然后通過后續的互換來覆蓋,最后通過慢指針判斷末尾的空格,如果末尾有空格則將數組大小控制在slow - 1,不然控制在slow。

在主函數中,我們先進行冗余空格的處理,然后反轉字符串,通過一個for循環對逐個單詞進行翻轉。

55:右旋字符串

字符串的右旋轉操作是把字符串尾部的若干個字符轉移到字符串的前面。給定一個字符串 s 和一個正整數 k,請編寫一個函數,將字符串中的后面 k 個字符移到字符串的前面,實現字符串的右旋轉操作。?

例如,對于輸入字符串 "abcdefg" 和整數 2,函數應該將其轉換為 "fgabcde"。

輸入描述

輸入共包含兩行,第一行為一個正整數 k,代表右旋轉的位數。第二行為字符串 s,代表需要旋轉的字符串。

輸出描述

輸出共一行,為進行了右旋轉操作后的字符串。

輸入示例

2
abcdefg

輸出示例

fgabcde

就是找規律然后翻轉特定區間內的字符串,現將整體反過來,然后換分為兩個區域進行翻轉即可。?

#include<bits/stdc++.h>
using namespace std;
void reverse(string& s, int start, int end){int l = start, r = end;while(l < r){swap(s[l++], s[r--]);}
}
int main(){int k;string s;cin >> k >> s;int n = s.size();reverse(s, 0, n - 1);reverse(s, 0, k - 1);reverse(s, k, n - 1);for(int i = 0; i < n; i++){cout << s[i];}    return 0;
}

子串匹配:(連續字符串)

KMP算法:

28:找出字符串中第一個匹配項的下標

給你兩個字符串?haystack?和?needle?,請你在?haystack?字符串中找出?needle?字符串的第一個匹配項的下標(下標從 0 開始)。如果?needle?不是?haystack?的一部分,則返回??-1?

示例 1:

輸入:haystack = "sadbutsad", needle = "sad"
輸出:0
解釋:"sad" 在下標 0 和 6 處匹配。
第一個匹配項的下標是 0 ,所以返回 0 。

NEXT數組的建立:

設置兩個指針:前綴指針指向公共前后綴中前綴的最后一個字符,后綴指針指向公共前后綴中后綴的最后一個字符。

遍歷過程:比較兩個指針所指向的元素如果相同,兩個指針一起向前移動,并將前綴指針的下標復制給next[i]表示當前前綴指針指向的元素所在的前面的子串中公共前后綴的字符數為j,如果不同就需要對前綴指針回退并檢查。這里我們檢查當前兩個指針所遍歷過得最長公共前后綴中是否含有子公共前后綴,這樣前綴指針就不需要回退到0

處重現開始檢查而是縮小了公共前后綴的長度(父到子的關系)再檢查j此時的字符是否與i相等,如果不等接著回退到上一級公共前綴的位置知到j到了初始位置0處停止回退。

模式串與字符串的比較:

與next數組的建立過程一致,只不過少了對next數組的賦值過程。保證遍歷字符串的指針i穩定前移,遇到相等的字符,模式串指針和字符串指針一起前進,當兩指針指向的字符不同時,此時next[ j ]表示當前模式串遍歷過去的子串中公共前后綴中前綴的最后一位的下一位位置,也就是說當前字符串指針遍歷過的i, j指向元素相等的這個子串中去除當前不同元素的子串中公共前后綴中公共前綴的下一位,從這一位直接開始比較而不需要從頭開始比較。

為了防止字符串每移動一位就需要遍歷一遍模式串,會不斷的縮小比較的范圍,當前位不一致時,從前面已經遍歷過的子串中回退到子串的公共前綴的下一位再開始比較,避免回退到初始位置進行比較。

class Solution {
public:// &:引用  void get_next(const string& s, int* next){int j = 0;next[0] = 0;for(int i = 1; i < s.size(); i++){// 前綴指針指向元素與后綴指針指向元素不一致,前綴指針回退到前一個存放的下標的的值while(j > 0 && s[i] != s[j]){j = next[j - 1];}// 后綴指針指向元素與前綴指針指向元素一致,兩指針一起向前移動if(s[i] == s[j]){j++;}next[i] = j; // next的賦值是在對j處理全部完成之后}}int strStr(string haystack, string needle) {if(needle.size() == 0){return 0;}vector<int> next(needle.size());get_next(needle, &next[0]);int j = 0;for(int i = 0; i < haystack.size(); i++){while(j > 0 && needle[j] != haystack[i]){j = next[j - 1];}if(needle[j] == haystack[i]){j++;}// 當模式串與主串比較完最后一個模式串的字符時j進行了加1操作if(j == needle.size()){return i - needle.size() + 1;}}return -1;}
};

注意if和while的順序,如果兩者順序顛倒就會出現j指針跑到i指針的前面去了會導致兩者從開始一直同步向前走時,在最后一處相同的位置比較完成之后j進行自增操作導致此時j+1和i不同導致錯位,提前進入while的錯誤循環。

?子序列匹配:(非連續字符串)

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

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

相關文章

【數據結構】算法效率的雙刃劍:時間復雜度與空間復雜度

前言 在算法的世界里&#xff0c;效率是衡量算法優劣的關鍵標準。今天&#xff0c;就讓我們深入探討算法效率的兩個核心維度&#xff1a;時間復雜度和空間復雜度&#xff0c;幫助你在算法設計的道路上更進一步。 一、算法效率&#xff1a;衡量算法好壞的關鍵 算法的效率主要…

Java基礎-26-多態-認識多態

在Java編程中&#xff0c;多態&#xff08;Polymorphism&#xff09; 是面向對象編程的核心概念之一。通過多態&#xff0c;我們可以編寫更加靈活、可擴展的代碼。本文將詳細介紹什么是多態、如何實現多態&#xff0c;并通過具體的例子來幫助你更好地理解這一重要概念。 一、什…

使用自定義的RTTI屬性對對象進行流操作

由于歷史原因&#xff0c;在借鑒某些特定出名的游戲引擎中&#xff0c;不知道當時的作者的意圖和編寫方式 特此做這篇文章。&#xff08;本文出自游戲編程精粹4 中 使用自定義的RTTI屬性對對象進行流操作 文章&#xff09; 載入和 保存 關卡&#xff0c;并不是一件容易辦到的事…

周總結aa

上周學習了Java中有關字符串的內容&#xff0c;與其有關的類和方法 學習了static表示靜態的相關方法和類的使用。 學習了繼承(extends) 多態&#xff08;有繼承關系&#xff0c;有父類引用指向子類對象&#xff09; 有關包的知識&#xff0c;final關鍵字的使用&#xff0c;及有…

密碼學基礎——密碼學相關概念

目錄 1.1 密碼系統&#xff08;Cryptosystem&#xff09; 1.2 密碼編碼學 1.3 密碼分析學 1.4 基于算法保密 1.5 基于密鑰保密 1.6密碼系統的設計要求 1.7 單鑰體制 1.8 雙鑰體制 密鑰管理 1.1 密碼系統&#xff08;Cryptosystem&#xff09; 也稱為密碼體制&#xff0…

初始JavaEE篇 —— Mybatis-plus 操作數據庫

找往期文章包括但不限于本期文章中不懂的知識點&#xff1a; 個人主頁&#xff1a;我要學編程程(?_?)-CSDN博客 所屬專欄&#xff1a;JavaEE 目錄 前言 Mybatis-plus 快速上手 Mybatis-plus 復雜操作 常用注解 TableName TableField TableId 打印日志 條件構造器 …

PyQt6實例_批量下載pdf工具_主線程啟用線程池

目錄 前置&#xff1a; 代碼&#xff1a; 視頻&#xff1a; 前置&#xff1a; 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭&#xff0c;放在 【PyQt6實例】 專欄 2 本系列涉及到的PyQt6知識點&#xff1a; 線程池&#xff1a;QThreadPool,QRunnable&#xff1b; 信號與…

1.2 斐波那契數列模型:LeetCode 面試題 08.01. 三步問題

動態規劃解三步問題&#xff1a;LeetCode 面試題 08.01. 三步問題 1. 題目鏈接 LeetCode 面試題 08.01. 三步問題 題目要求&#xff1a;小孩上樓梯&#xff0c;每次可以走1、2或3步&#xff0c;計算到達第 n 階臺階的不同方式數&#xff0c;結果需對 1e9 7 取模。 2. 題目描述…

UE5 學習筆記 FPS游戲制作30 顯示擊殺信息 水平框 UI模板(預制體)

文章目錄 一制作單條死亡信息框水平框的使用創建一個水平框添加子元素調整子元素順序子元素的布局插槽尺寸填充對齊 制作UI 根據隊伍&#xff0c;設置文本的名字和顏色聲明變量 將變量設置為構造參數根據隊伍&#xff0c;設置文本的名字和顏色在構造事件中&#xff0c;獲取玩家…

HTTP---基礎知識

天天開心&#xff01;&#xff01;&#xff01; 文章目錄 一、HTTP基本概念1. 什么是HTTP&#xff0c;又有什么用&#xff1f;2. 一次HTTP請求的過程3.HTTP的協議頭4.POST和GET的區別5. HTTP狀態碼6.HTTP的優缺點 二、HTTP的版本演進1.各個版本的應用場景2、注意要點 三、HTTP與…

數據結構 KMP 字符串匹配算法

KMP算法是計算機科學中的一種字符串匹配算法&#xff0c;KMP是三個創始人名字首字母 題目 AcWing - 算法基礎課 前置知識點 KMP算法是一種高效的字符串匹配算法&#xff0c;算法名稱取自于三位共同發明人名字的首字母組合。該算法的主要使用場景就是在字符串&#xff08;也叫…

Conda配置Python環境

1. 安裝 Conda 選擇發行版&#xff1a; Anaconda&#xff1a;適合需要預裝大量科學計算包的用戶&#xff08;體積較大&#xff09;。 Miniconda&#xff1a;輕量版&#xff0c;僅包含 Conda 和 Python&#xff08;推薦自行安裝所需包&#xff09;。 驗證安裝&#xff1a; co…

數倉開發那些事(11)

某神州優秀員工&#xff1a;一閃&#xff0c;領導說要給我漲米。 一閃&#xff1a;。。。。&#xff08;著急的團團轉&#xff09; 老運維&#xff1a;Oi&#xff0c;兩個吊毛&#xff0c;看看你們的hadoop集群&#xff0c;健康度30分&#xff0c;怎么還在抽思謀克&#xff1f…

MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案

? MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案 前言一、問題現象二、原因分析1. 使用了 strictInsertFill/strictUpdateFill 導致更新失效2. 實體類注解配置錯誤3. MetaObjectHandler 未生效4. 使用自定義 SQL 導致自動填充失效5. 字段類型不匹配 三、…

C++ STL常用算法之常用算術生成算法

常用算術生成算法 學習目標: 掌握常用的算術生成算法 注意: 算術生成算法屬于小型算法&#xff0c;使用時包含的頭文件為 #include <numeric> 算法簡介: accumulate // 計算容器元素累計總和 fill // 向容器中添加元素 accumulate 功能描述: 計算區間內容器元素…

axios基礎入門教程

一、axios 簡介 axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;可用于瀏覽器和 Node.js 環境&#xff0c;支持以下特性&#xff1a; 發送 HTTP 請求&#xff08;GET/POST/PUT/DELETE 等&#xff09; 攔截請求和響應 自動轉換 JSON 數據 取消請求 并發請求處理 二…

短視頻團隊架構工作流程---2025.3.30 李劭卓

短視頻團隊架構&工作流程—2025.3.30 李劭卓 文章目錄 短視頻團隊架構&工作流程---2025.3.30 李劭卓1 工作職責1.1 編劇&#xff1a;1.2 主編&#xff1a;1.3 總編&#xff1a;1.4 導演&#xff1a;1.5 攝影&#xff1a;1.6 演員&#xff1a;1.7 后期&#xff1a;1.8 美…

MySQL 高效 SQL 使用技巧詳解

MySQL 高效 SQL 使用 技巧詳解 一、為什么需要優化 SQL&#xff1f; 性能瓶頸&#xff1a;慢查詢導致數據庫負載升高&#xff0c;響應時間延長。資源浪費&#xff1a;低效 SQL 可能占用大量 CPU、內存和磁盤 I/O。 目標&#xff1a;通過優化 SQL 將查詢性能提升 10 倍以上&am…

AI基礎03-視頻數據采集

上篇文章我們學習了圖片的數據采集&#xff0c;今天主要了解一下視頻數據采集的方法。視頻是由一系列圖像構成的&#xff0c;其中每一張圖片就是一幀。視頻數據采集方法通常有自動圖像采集和基于處理器的圖像采集兩種。我們學習一下如何利用python 工具和筆記本計算機攝像頭進行…

Scala 數組

Scala 數組 引言 Scala 作為一門多范式編程語言&#xff0c;融合了面向對象和函數式編程的特點。數組是編程語言中非常基礎和常見的數據結構&#xff0c;在 Scala 中也不例外。本文將詳細介紹 Scala 中的數組&#xff0c;包括其定義、操作以及在實際開發中的應用。 Scala 數…