【優選算法 | 字符串】字符串模擬題精選:思維+實現解析

在這里插入圖片描述

算法相關知識點可以通過點擊以下鏈接進行學習一起加油!
雙指針滑動窗口二分查找前綴和位運算
模擬鏈表哈希表

在眾多字符串算法題中,有一類題目看起來沒有太多算法技巧,卻經常讓人“翻車”——那就是字符串模擬題。這類題型往往不依賴復雜的數據結構或高級算法,更多的是對邏輯構造能力、字符串操作細節以及邊界處理的考察。本文將通過幾個典型字符串模擬題的拆解,幫助你梳理解題思路、掌握通用技巧,從而在這類題目中穩住基本盤。

請添加圖片描述

Alt

🌈個人主頁:是店小二呀
🌈C/C++專欄:C語言\ C++
🌈初/高階數據結構專欄: 初階數據結構\ 高階數據結構
🌈Linux專欄: Linux
🌈算法專欄:算法
🌈Mysql專欄:Mysql

🌈你可知:無人扶我青云志 我自踏雪至山巔 請添加圖片描述

文章目錄

    • 14. 最長公共前綴
    • 5. 最長回文子串
    • 67. 二進制求和
    • 43. 字符串相乘

14. 最長公共前綴

題目】:14. 最長公共前綴
在這里插入圖片描述

算法思路

解法一:兩兩比較

在這里插入圖片描述

通過兩兩比較的方式,不斷循環尋找字符不相等的位置,利用 substr 接口進行字符串剪切。這里,‘最長公共前綴’的意思是根據木桶效應,取最短字符串的長度作為‘最長公共前綴’的上限。

代碼實現

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {//解法一:兩兩結合string tmp = strs[0];for(int i = 1; i< strs.size(); i++)tmp = findpRrefix(tmp, strs[i]);return tmp;}string findpRrefix(string& s1, string& s2){int i = 0;while(i < min(s1.size(), s2.size()) && s1[i] == s2[i]) i++;return s1.substr(0, i);}
};

解法二:統一比較

在這里插入圖片描述

使用 char 類型變量記錄字符串中的元素,通過循環逐個比較字符是否相等。考慮到‘最長公共前綴’的上限,當某段完全相同的字符串長度等于當前遍歷的字符串長度時,說明已經達到了公共前綴的上限,此時可以直接返回結果。

代碼實現

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {//解法二:統計比較for(int j = 0; j < strs[0].size(); j++){char ch = strs[0][j];for(int i = 0; i < strs.size(); i++){if( j == strs[i].size()  || strs[i][j] != ch) return strs[0].substr(0,j);}}return strs[0];}
};

5. 最長回文子串

題目】:5. 最長回文子串

在這里插入圖片描述

算法思路

解法:中心擴展算法

  1. 固定一個中心點。
  2. 從中心開始,向兩邊擴展。

注意:需要同時考慮奇數長度和偶數長度的回文情況。擴展過程中,若遇到越界或不符合回文性質時,停止并返回。中心擴展算法特別適用于回文數的對稱特性。

代碼實現

class Solution {
public:string longestPalindrome(string s) {//中心擴展算法int begin = 0, len = 0;int n = s.size();for(int i = 0; i < n; i++) //依次枚舉所有的中點{int left = i, rigth = i;//奇數擴張while(left >= 0 && rigth < n && s[left] == s[rigth]){left--;rigth++;}if(rigth - left - 1 > len){begin = left + 1;len = rigth - left - 1;}//偶數擴張left = i, rigth = i + 1;while(left >= 0 && rigth < n && s[left] == s[rigth]){left--;rigth++;}if(rigth - left - 1 > len){begin = left + 1;len = rigth - left - 1;}}return s.substr(begin,len);}
};

67. 二進制求和

題目】:67. 二進制求和

在這里插入圖片描述

算法思路

解法:高精度模擬加減乘除

高精度算法模擬了列豎式計算過程,通常稱為‘二進制高精度加法算法’,對于兩個字符串的處理從低位開始。需要特別注意進位處理邏輯,并且要處理前導零的情況。判斷條件為:當 cur >= 0 時,繼續處理到最前的數據,若不需要加上原數據,默認加0。

數字字符轉換為整型時:數字字符 - '0' 即得到整型值。

最后,使用 reverse 進行翻轉,以符合題目的要求。

在這里插入圖片描述

代碼實現

class Solution {
public:string addBinary(string a, string b) {int cur1 = a.size() - 1, cur2 = b.size() - 1;int t = 0;string ret;while(cur1 >= 0 || cur2 >=0 || t ){if(cur1 >= 0)  t += a[cur1--] - '0'; if(cur2 >= 0)  t += b[cur2--] - '0'; ret += t % 2 + '0';t /= 2;}reverse(ret.begin(), ret.end());return ret;}
};

43. 字符串相乘

題目】:43. 字符串相乘

在這里插入圖片描述

算法思路

解法一:"模擬"小學的列豎式運算
在這里插入圖片描述

解法二:無進位相乘然后相加,最后處理進位

在這里插入圖片描述

關于此類高精度題目,推薦先將原始字符串進行反轉,因為列豎式計算是從低位開始的。對于兩個字符串,先反轉它們,再將數字字符轉換為整型,通過數組存儲結果。我們創建的數組大小為 m + n - 1,其中 mn 分別是兩個字符串的長度。通過數學或繪圖分析,可以發現這個剛好滿足累加所需的存儲空間。

這里使用無進位相乘然后相加,最后再處理進位。由于無論是先進行進位還是后進行進位,最終的結果是相同的,因此我們推薦先將結果存儲下來,然后再進行進位處理,這樣更為方便和簡潔,避免了細節很多存在的問題。

算法步驟:

第一步:將輸入的兩個字符串反轉,以便從低位開始進行處理。

第二步:對于兩個字符串中的數字,通過下標相加,其兩個數字結果正好對應數組中相應位置的值。在進行加法時,需使用 += 來累加結果。

第三步:在處理完所有操作后,可能會出現前導零的情況。最終需要使用 reverse 進行翻轉,并去掉多余的前導零。可以通過以下代碼來去除前導零:while (ret.size() > 1 && ret.back() == '0') ret.pop_back();

代碼實現

class Solution 
{
public:string multiply(string nums1, string nums2) {int n = nums1.size(), m = nums2.size();//字符串反轉reverse(nums1.begin(), nums1.end());reverse(nums2.begin(), nums2.end());vector<int> nums(m + n - 1);for(int i = 0; i < n; i++)for(int j = 0; j < m; j++)nums[i + j] += ((nums1[i] - '0') * (nums2[j] - '0')) ;//進位處理string ret;int t = 0, cur = 0;while( cur < m + n -1 || t){if(cur < m + n -1) t += nums[cur++];ret += t % 10 + '0';t /= 10;}//4.處理前導零while(ret.size() > 1 && ret.back() == '0') ret.pop_back();reverse(ret.begin(), ret.end());return ret;}
};

在這里插入圖片描述
快和小二一起踏上精彩的算法之旅!關注我,我們將一起破解算法奧秘,探索更多實用且有趣的知識,開啟屬于你的編程冒險!

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

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

相關文章

虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系

虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系 code review! 文章目錄 虛幻引擎5-Unreal Engine筆記之Default Pawn與GamMode、Camera的關系1.Default Pawn與Camera的關系1.1. Default Pawn 是什么&#xff1f;1.2. Default Pawn 的主要組件1.3. Default…

HarmonyOs開發之———UIAbility進階

謝謝關注!! 前言:上一篇文章主要介紹開發之———使用HTTP訪問網絡資源:HarmonyOs開發之———使用HTTP訪問網絡資源-CSDN博客 代碼資源:https://download.csdn.net/download/this_is_bug/90841580 一、基本概念 UIAbility 是 HarmonyOS 應用的核心組件,負責用戶界面的…

java實現根據Velocity批量生成pdf并合成zip壓縮包

Velocity 模版操作 用的之前寫好的: 傳送門 其中需要新加一個轉成輸入流的方法 public static InputStream convertToPdf(StringWriter stringWriter) throws IOException {//將 HTML 轉為字節流byte[] htmlBytes stringWriter.toString().getBytes(StandardCharsets.UTF_8)…

SCDN能夠運用在物聯網加速當中嗎?

在當今的科技化時代當中&#xff0c;物聯網已經廣泛滲透在各個領域行業當中&#xff0c;隨著物聯網規模的不斷擴大&#xff0c;數據信息的傳輸速度和網絡穩定性成為企業需要重視的兩點因素&#xff0c;而SCDN也成為安全內容分發網絡作為一種融合了內容加速和安全防護的技術&…

二程運輸的干散貨船路徑優化

在二程運輸中&#xff0c;干散貨船需要將貨物從一個港口運輸到多個不同的目的地港口。路徑優化的目標是在滿足貨物運輸需求、船舶航行限制等條件下&#xff0c;確定船舶的最佳航行路線&#xff0c;以最小化運輸成本、運輸時間或其他相關的優化目標。 影響因素 港口布局與距離…

Oracle物理恢復相關注意點

如果需要恢復的數據庫或者數據文件不存在&#xff0c;則需要將全量備份集RESTORE[ 將全量備份集恢復到目標數據庫中&#xff0c;稱之為RESTORE。]到目標數據庫中&#xff0c;然后再RECOVER[ 將增量備份集或者歸檔日志恢復到目標數據庫中&#xff0c;稱之為RECOVER。]增量備份集…

C++ string小記

#include<string> using std::string;string s1; string s2 "hello" //初始化一個hello字符串 string s3(5,a) //連續5個字符a組成的串&#xff0c;即aaaaa///字符串操作int length s1.size() //.size()求字符串長度char c1 s1[1]; //從下標0開始&#xf…

自然語言處理入門級項目——文本分類(預處理)

文章目錄 前言1.數據預處理1.1數據集介紹1.2數據集抽取1.3劃分數據集1.4數據清洗1.5數據保存 2.樣本的向量化表征2.1詞匯表2.2向量化2.3自定義數據集2.4備注 結語 前言 本篇博客主要介紹自然語言處理領域中一個項目案例——文本分類&#xff0c;具體而言就是判斷評價屬于積極還…

C++面試2——C與C++的關系

C與C++的關系及核心區別的解析 一、哲學與編程范式:代碼組織的革命 過程式 vs 多范式混合 C語言是過程式編程的典范,以算法流程為中心,強調“怎么做”(How)。例如,實現鏈表操作需手動管理節點指針和內存。 C++則是多范式語言,支持面向對象(OOP)、泛型編程(模板)、函…

HTTP與HTTPS協議的核心區別

HTTP與HTTPS協議的核心區別 數據傳輸安全性 HTTP采用明文傳輸&#xff0c;數據易被竊聽或篡改&#xff08;如登錄密碼、支付信息&#xff09;&#xff0c;而HTTPS通過SSL/TLS協議對傳輸內容加密&#xff0c;確保數據完整性并防止中間人攻擊。例如&#xff0c;HTTPS會生成對稱加…

PotPlayer 安裝 madVR、LAV Filters 以提升解碼能力和視頻音頻效果

PotPlayer自帶的解碼器并不是最好&#xff0c;如下兩張截圖都是出自 TOP GUN: Maverick 較暗、灰蒙蒙的一張&#xff0c;是安裝插件之前明亮的一張&#xff0c;是安裝插件之后 詳細安裝參考 https://www.bilibili.com/video/BV1UV5qzuE74?spm_id_from333.788.videopod.sectio…

深入理解 OpenCV 的 DNN 模塊:從基礎到實踐

在計算機視覺領域蓬勃發展的當下&#xff0c;深度學習模型的廣泛應用推動著技術的不斷革新。OpenCV 作為一款強大且開源的計算機視覺庫&#xff0c;其 DNN&#xff08;Deep Neural Network&#xff09;模塊為深度學習模型的落地應用提供了高效便捷的解決方案。本文將以理論為核…

Spring MVC 中請求處理流程及核心組件解析

在 Spring MVC 中&#xff0c;請求從客戶端發送到服務器后&#xff0c;需要經過一系列組件的處理才能最終到達具體的 Controller 方法。這個過程涉及多個核心組件和復雜的映射機制&#xff0c;下面詳細解析其工作流程&#xff1a; 1. 核心組件與請求流程 Spring MVC 的請求處…

RISC-V 開發板 MUSE Pi Pro V2D圖像加速器測試,踩坑介紹

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro V2D圖像加速器測試&#xff0c;踩坑介紹 今天測試下V2D&#xff0c;這是K1特有的硬件級別的2D圖像加速器&#xff0c;參考如下文檔&#xff0c;但文檔中描述的部分有不少問題&#xff0c;后面會講下 https://bianbu-linux.spa…

hbase shell的常用命令

一、hbase shell的基礎命令 # 版本號查看 [rootTest-Hadoop-NN-01 hbase]$ ./bin/hbase version HBase 2.4.0 Source code repository git://apurtell-ltm.internal.salesforce.com/Users/apurtell/src/hbase revision282ab70012ae843af54a6779543ff20acbcbb629# 客戶端登錄 […

深入解析Python中的Vector2d類:從基礎實現到特殊方法的應用

引言 在Python面向對象編程中&#xff0c;特殊方法&#xff08;或稱魔術方法&#xff09;是實現對象豐富行為的關鍵。本文將以Vector2d類為例&#xff0c;詳細講解如何通過特殊方法為自定義類添加多種表示形式和操作能力。 Vector2d類的基本行為 Vector2d類是一個二維向量類…

Zookeeper入門(三)

Zookeeper Java 客戶端 項目構建 ookeeper 官方的客戶端沒有和服務端代碼分離&#xff0c;他們為同一個jar 文件&#xff0c;所以我們直接引入 zookeeper的maven即可&#xff0c; 這里版本請保持與服務端版本一致&#xff0c;不然會有很多兼容性的問題 1 <dependency>…

Redis的主從架構

主從模式 全量同步 首先主從同步過程第一步 會先比較replication id 判斷是否是第一次同步假設為第一次同步 那么就會 啟動bgsave異步生成RDB 同時fork子進程記錄生成期間的新數據發送RDB給從節點 清空本地數據寫入RDB 增量同步 對比ReplicationID不同因此選擇增量同步在Rep…

新電腦軟件配置二:安裝python,git, pycharm

安裝python 地址 https://www.python.org/downloads/ 不是很懂為什么這么多版本 安裝windows64位的 這里我是憑自己感覺裝的了 然后cmd輸入命令沒有生效&#xff0c;先重啟下&#xff1f; 重啟之后再次驗證 環境是成功的 之前是輸入的python -version 命令輸入錯誤 安裝pyc…

docker 學習記錄

docker pull nginx docker 將本地nginx快照保存到當前文件夾下 docker save -o nginx.tar nginx:latestdocker 將本地nginx 加載 docker load -i nginx.tar docker運行nginx在80端口 docker run --name dnginx -p 80:80 -d nginxredis啟動 docker run --name mr -p 6379:6379 -…