代碼隨想錄 -- 字符串

文章目錄

  • 反轉字符串
    • 描述
    • 題解
  • 反轉字符串II
    • 描述
    • 題解
  • 替換數字
    • 描述
    • 題解:replace函數
    • 題解:雙指針
  • 翻轉字符串里的單詞
    • 描述
    • 題解
  • 右旋字符串
    • 描述
    • 題解
  • 實現 strStr()
    • 描述
    • 題解:暴力算法
    • 題解:KMP算法(懵懂)
  • 重復的子字符串
    • 描述
    • 題解
    • 題解:暴力
    • 題解:KMP
    • 題解:移動匹配

反轉字符串

題目鏈接

描述

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

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

你可以假設數組中的所有字符都是 ASCII 碼表中的可打印字符。

示例 1:
輸入:[“h”,“e”,“l”,“l”,“o”]
輸出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
輸入:[“H”,“a”,“n”,“n”,“a”,“h”]
輸出:[“h”,“a”,“n”,“n”,“a”,“H”]

題解

C++庫函數 reverse 做題肯定要了解其內部原理

class Solution {
public:void swap(char&c1,char&c2){char tmp = c1;c1=c2;c2=tmp;}void reverseString(vector<char>& s) {size_t left = 0,right = s.size()-1;while(left <right){swap(s[left],s[right]);++left;--right;}}
};

反轉字符串II

題目鏈接

描述

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

如果剩余字符少于 k 個,則將剩余字符全部反轉。

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

示例:

輸入: s = “abcdefg”, k = 2
輸出: “bacdfeg”

題解

字符串是一段一段的進行反轉,所以我們在循環的時候可以每次+一段

class Solution {
public:string reverseStr(string s, int k) {size_t len = s.size();// 對于字符串是一段一段的處理 所以可以一次跳一段for(int i=0;i<len;i+=2*k){if(i+k<=len){reverse(s.begin()+i,s.begin()+i+k);continue;}reverse(s.begin()+i,s.end());}return s;}
};

替換數字

題目鏈接

描述

給定一個字符串 s,它包含小寫字母和數字字符,請編寫一個函數,將字符串中的字母字符保持不變,而將每個數字字符替換為number。

例如,對于輸入字符串 “a1b2c3”,函數應該將其轉換為 “anumberbnumbercnumber”。

對于輸入字符串 “a5b”,函數應該將其轉換為 “anumberb”

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

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

樣例輸入:a1b2c3

樣例輸出:anumberbnumbercnumber

數據范圍:1 <= s.length < 10000。

題解:replace函數

利用string的replace函數

#include <iostream>
#include <string>
using namespace std;void change_string(string&s){size_t len = s.size();for(int i=0;i<len;++i){if(s[i]<='9'&&s[i]>='0'){s.replace(s.begin()+i,s.begin()+i+1,"number");len+=5;i+=5;			}}
}
int main(){string s{"1das1das25das"};change_string(s);cout<<s<<"\n";return 0;
}

題解:雙指針

先將字符串擴充到最后的大小,然后從后先前進行填充

#include <iostream>
#include <string>
using namespace std;void change_string(string&s){size_t old_len = s.size();int count{0};for(int i=0;i<old_len;++i){if(s[i]<='9'&&s[i]>='0')++count;}s.resize(old_len+5*count);size_t new_len = s.size();for(int front = old_len-1,back=new_len-1;front>=0;--back,--front){if(s[front]>='0'&&s[front]<='9'){s[back]='r';s[back-1]='e';s[back-2]='b';s[back-3]='m';s[back-4]='u';s[back-5]='n';back-=5;}elses[back]=s[front];}
}
int main(){string s;cin>>s;change_string(s);cout<<s<<"\n";return 0;
}

翻轉字符串里的單詞

題目鏈接

描述

給定一個字符串,逐個翻轉字符串中的每個單詞。

示例 1:
輸入: “the sky is blue”
輸出: “blue is sky the”

示例 2:
輸入: " hello world! "
輸出: “world! hello”
解釋: 輸入字符串可以在前面或者后面包含多余的空格,但是反轉后的字符不能包括。

示例 3:
輸入: “a good example”
輸出: “example good a”
解釋: 如果兩個單詞間有多余的空格,將反轉后單詞間的空格減少到只含一個。

題解

分三個步驟:
1、去除多余空格
2、全部字符串進行反轉
3、字符串中的單詞進行一個一個的反轉

class Solution {
public:void deleteSpace(string &s){int slow{0},fast{0};size_t len{s.size()};//去除多余的前面的空格while(len>0&&fast<len&&s[fast]==' ')++fast;while(fast<len){//去除中間if(fast-1>0&&s[fast-1]==' '&&s[fast]==' '){++fast;continue;}elses[slow++]=s[fast++];}//去除尾部if(slow-1>0&&s[slow-1]==' ')s.resize(slow-1);elses.resize(slow);}//[beg,end]void reverse(string&s,int beg,int end){for(;beg<end;--end,++beg){char tmp = s[beg];s[beg] = s[end];s[end] = tmp;}}string reverseWords(string s) {deleteSpace(s);size_t len = s.size();reverse(s,0,len-1);int i,j;for(i=0,j=0;i<len;++i){if(s[i]==' '){reverse(s,j,i-1);j=i+1;}}reverse(s,j,i-1);return s;}
};

右旋字符串

題目鏈接

描述

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

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

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

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

樣例輸入:

2
abcdefg

樣例輸出:

fgabcde

數據范圍:1 <= k < 10000, 1 <= s.length < 10000;

題解

1、整體反轉
2、起點到target這一段反轉
3、target到結尾這一段反轉

#include <iostream>
#include <string>
using namespace std;
// [beg,end]
void my_reverse(string&s,int beg,int end){for(;beg<end;++beg,--end){int tmp = s[beg];s[beg]=s[end];s[end]=tmp;}
}
void rightHanded(string&s,int target){size_t len = s.size();my_reverse(s,0,len-1);my_reverse(s,0,target-1);my_reverse(s,target,len-1);
} 
int main(){string s;int target;cin>>target>>s;rightHanded(s,target);cout<<s<<endl;return 0;
}

實現 strStr()

題目鏈接

描述

實現 strStr() 函數。

給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。

示例 1: 輸入: haystack = “hello”, needle = “ll” 輸出: 2

示例 2: 輸入: haystack = “aaaaa”, needle = “bba” 輸出: -1

說明: 當 needle 是空字符串時,我們應當返回什么值呢?這是一個在面試中很好的問題。 對于本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。

題解:暴力算法

class Solution {
public:int strStr(string haystack, string needle) {if(haystack==""||needle=="")return -1;int pLen = haystack.size(),sLen = needle.size();for(int i = 0; i < pLen;++i){if(haystack[i]==needle[0]){int j = 1;for(;j<sLen;++j)if(haystack[i+j]!=needle[j])break;if(j==sLen)return i;}}return -1;}
};

題解:KMP算法(懵懂)

KMP算法:解決字符串匹配的問題

最長相等前后綴得到前綴表


class Solution {
public:void getNext(int *next,const string&s){/*初始化:i:后綴末尾j:前綴末尾*/int j{-1};next[0] = j;for(int i=1;i<s.size();i++){// 前后綴不相同while(j>=0&&s[j+1]!=s[i])j=next[j];//回退// 前后綴相同if(s[j+1]==s[i])++j;// 將j(前綴的長度)賦給next[i]next[i]=j;}}int strStr(string haystack, string needle) {if(!(haystack.size())||!(needle.size()))return -1;int next[needle.size()];getNext(next,needle);int j = -1; // // 因為next數組里記錄的起始位置為-1for(int i=0;i<haystack.size();++i){while(j>=0&&needle[j+1]!=haystack[i])j = next[j];if(haystack[i]==needle[j+1])++j;if(j==(needle.size()-1))return (i-needle.size()+1);}return -1;}
};

重復的子字符串

題目鏈接

描述

題解

給定一個非空的字符串,判斷它是否可以由它的一個子串重復多次構成。給定的字符串只含有小寫英文字母,并且長度不超過10000。

示例 1:

輸入: “abab”
輸出: True
解釋: 可由子字符串 “ab” 重復兩次構成。
示例 2:

輸入: “aba”
輸出: False
示例 3:

輸入: “abcabcabcabc”
輸出: True
解釋: 可由子字符串 “abc” 重復四次構成。 (或者子字符串 “abcabc” 重復兩次構成。)

題解:暴力

class Solution {
public:bool repeatedSubstringPattern(string s) {string tmp,str;for(int i=0;i<s.size()/2;++i){str="";tmp+=s[i];while(str.size()<s.size())str+=tmp;if(str==s)return true;}return false;}
};

題解:KMP

class Solution {
public:void getNext(int *next,const string &s){int j=-1;next[0]=j;for(int i=1;i<s.size();i++){while(j>=0 && s[i]!=s[j+1])j=next[j];if(s[i]==s[j+1])++j;next[i]=j;}}bool repeatedSubstringPattern(string s) {int len = s.size();if(len==0)return false;int next[len];getNext(next,s);if(next[len-1]!=-1 && len % (len - (next[len-1]+1))==0)return true;return false;}
};

題解:移動匹配

class Solution {
public:bool repeatedSubstringPattern(string s) {string t = s+s;t.erase(t.end()-1);if(t.find(s,1)!=string::npos)return true;return false;}
};

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

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

相關文章

數據備份(上)

備份的意義 數據備份是容災的基礎&#xff0c;防止系統出現操作失誤或者遭受網絡攻擊導致數據丟失&#xff0c;為保證數據安全和業務連續性&#xff0c;有效的防護措施&#xff0c;對數據進行合理的備份、防范于未然。 面臨的威脅 去年2023年10月親自經歷客戶某網站無法訪問…

WEB-UI自動化測試實踐

&#x1f525; 交流討論&#xff1a;歡迎加入我們一起學習&#xff01; &#x1f525; 資源分享&#xff1a;耗時200小時精選的「軟件測試」資料包 &#x1f525; 教程推薦&#xff1a;火遍全網的《軟件測試》教程 &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1…

已解決的問題:BIOS中Enter鍵失效_BIOS中回車鍵沒反應

問題&#xff1a; 未解決的問題&#xff1a;BIOS中enter鍵失效_bios回車鍵沒反應-CSDN博客 問題復現&#xff1a; Windows7 關機 開機按F2進入BIOS 調整Boot Mode&#xff0c;按Enter建&#xff0c;Enter鍵失效 按F10&#xff0c;按Enter鍵&#xff0c;Enter鍵失效 按E…

LeetCode59-螺旋矩陣II

參考鏈接&#xff1a;代碼隨想錄->螺旋矩陣II 關鍵是學視頻鏈接里面的編碼思想&#xff0c;然后背下來 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…

HTML好玩代碼(正式版)

今天給大家幾個好玩兒的HTML代碼&#xff0c;可以自行修改文字&#xff0c;更改效果&#xff08;一定要看到最后&#xff09;&#xff0c;代碼&#xff0c;&#x1f389;走起&#xff1a; 一、圣誕樹效果&#xff08;音樂可自行選擇&#xff09; 代碼&#xff1a; <!DOCTY…

vite是什么

vite 是什么 vite —— 一個由 vue 作者尤雨溪開發的 web 開發工具 Vite由兩個主要部分組成 dev server&#xff1a;利用瀏覽器的ESM能力來提供源文件&#xff0c;具有豐富的內置功能并具有高效的HMR生產構建&#xff1a;生產環境利用Rollup來構建代碼&#xff0c;提供指令用…

基于情感分析的網上圖書推薦系統

項目&#xff1a;基于情感分析的網上圖書推薦系統 摘 要 基于網絡爬蟲的數據可視化服務系統是一種能自動從網絡上收集信息的工具&#xff0c;可根據用戶的需求定向采集特定數據信息的工具&#xff0c;本項目通過研究爬取網上商品評論信息實現商品評論的情感分析系統功能。對于…

嵌入式學習25-復習指針要點

1指針 1.1語法&#xff1a; 【基類型*指針變量名】 【int *p&a】 1 2 1.2語義&#xff1a; 【基類型】&#xff1a;指針變量指向的目標的數據類型 【*】&#xff1a;表示此時定義的變量是一個指針類型的變量 【&a】&#xff1a;一塊存放著int類型數據的空間的地址 【*p…

Flutter開發LongPressDraggable、Draggable 的onDragEnd沒有被調用

文章目錄 onDragEnd 什么時候執行&#xff1f;onDragEnd 在拖動結束時沒有被調用的可能原因 onDragEnd 什么時候執行&#xff1f; onDragEnd 回調函數在拖動結束時執行&#xff0c;但要注意&#xff0c;拖動結束有多種情況&#xff0c;不僅僅是松開手指觸發的。 onDragEnd 會…

【國產MCU】-CH32V307-通用定時器(GPTM)-單脈沖模式

通用定時器(GPTM)-單脈沖模式 文章目錄 通用定時器(GPTM)-單脈沖模式1、單脈沖模式介紹2、驅動API介紹3、單脈沖使用實例本文將詳細介紹如何使用CH32V307通用定時器的單脈沖模式。 1、單脈沖模式介紹 單脈沖模式可以響應一個特定的事件,在一個延遲之后產生一個脈沖,延遲…

Seata 的 AT 模式

目錄 概述 Springcloud 整合 Seata 數據庫腳本 服務依賴 Springboot 配置 代碼改造 AT模式下的數據隔離 寫隔離 讀隔離 概述 Seata 的 AT 模式是 Seata 的默認模式&#xff0c;它的原理是依賴于數據庫事務&#xff0c;以數據庫事務保證本地事務分支特性&#xff0c;結合…

windows系統用VS環境開發linux程序之一

主要有兩種方法&#xff0c;一種是在windows中安裝linux子系統&#xff0c;即WSL&#xff0c;另一種是windows系統裝linux虛擬機。 這里先用虛擬機方法。參考文章&#xff1a; 用VS2015開發Linux程序詳細教程-配置篇_vs2015可以在linux安裝嗎-CSDN博客 這篇基本就夠了。不過…

nginx之web性能location優先級

4.2 event事件 events {worker_connections 65536; #設置單個工作進程的最大并發連接數use epoll;#使用epoll事件驅動&#xff0c;Nginx支持眾多的事件驅動&#xff0c;比如:select、poll、epoll&#xff0c;只能設置在events模塊中設置。accept_mutex on; #on為同一時刻一個…

設計模式之委派模式

文章目錄 前言正文一、生活中的例子二、Java代碼實現2.1 類設計2.2 代碼實現2.2.1 Employee2.2.2 ArchitectureDesignEmployer2.2.3 BackEmployer2.2.4 FrontEmployer2.2.5 Leader2.2.6 EmployeeStrongPointEnum2.2.7 Boss 2.3 測試2.3.1 Client2.3.2 測試結果 三、委派模式的優…

Docker Desktop 4.27.1 Windows 10 安裝 教程

Docker Desktop 4.27.1 Windows 10 安裝 版本要求windows 版本要求wsl 版本要求docker desktop 版本 安裝首先確保系統版本符合要求前提下安裝wsl安裝 Dockers Desktop安裝說明 安裝問題docker Desktop 無法正常啟動&#xff0c;提示wsl 相關信息wsl --install 執行輸出幫助日志…

Python 程序中查看 Python version

Python 程序中查看 Python version 1. Code2. OutputReferences 1. Code #!/usr/bin/env python3 # -*- coding:utf-8 -*-import platform import sysprint("\nplatform.python_version():") print(platform.python_version())print("\nsys.version:") pr…

springboot大學生體質測試管理系統源碼和論文

大學生體質測試管理系統提供給用戶一個簡單方便體質測試管理信息&#xff0c;通過留言區互動更方便。本系統采用了B/S體系的結構&#xff0c;使用了java技術以及MYSQL作為后臺數據庫進行開發。系統主要分為系統管理員、教師和用戶三個部分&#xff0c;系統管理員主要功能包括首…

圖像分類入門:使用Python和Keras實現卷積神經網絡

文章標題&#xff1a;圖像分類入門&#xff1a;使用Python和Keras實現卷積神經網絡 簡介 圖像分類是計算機視覺領域的一個重要任務&#xff0c;它涉及將圖像分成不同的類別或標簽。卷積神經網絡&#xff08;CNN&#xff09;是圖像分類任務中的一種常用模型&#xff0c;它能夠…

rust實戰系列十四:復合數據類型

復合數據類型可以在其他類型的基礎上形成更復雜的組合關系。 本章介紹tuple、struct、enum等幾種復合數據類型。數組留到第6章介紹。 2.3.1 tuple tuple指的是“元組”類型&#xff0c;它通過圓括號包含一組表達式構成。tuple內的元素沒 有名字。tuple是把幾個類型組合到一起的…

第三十九天| 62.不同路徑、63. 不同路徑 II

Leetcode 62.不同路徑 題目鏈接&#xff1a;62 不同路徑 題干&#xff1a;一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “…