棧(LIFO)算法題

1.刪除字符串中所有相鄰的重復字符

注意,我們需要重復處理,而不是處理一次相鄰的相同元素就結束了。對示例來說,如果只進行一次處理,結果為aaca,但是處理之后又出現了相鄰的重復元素,我們還得繼續處理,最后結果就是ca。

解法:借助棧來模擬

? ? ? ? 我們可以將字符串中的元素依次入棧,元素入棧前判斷是否與棧頂元素相等,如果相等就彈出棧頂元素,繼續判斷下一個元素。等到字符串全部入棧,棧中的就是最終答案。

但是我們沒有必要弄一個stack出來,因為這樣最終結果是逆序的,我們可以采用string來模擬棧的行為。?

時間復雜度:O(n)

空間復雜度:O(n)?

class Solution 
{
public:string removeDuplicates(string s) {// 用string模擬棧string ret;for(auto e : s){if(ret.size() && ret.back() == e) ret.pop_back();else ret.push_back(e);}return ret;}
};

2.比較含退格的字符串?

解法1:使用棧來模擬?

? ? ? ? 我們可以封裝一個函數出來,用來處理字符串中的退格符。然后比較處理之后的字符串即可。而處理字符串的過程,就可以使用棧來模擬,如果不是#就入棧,如果遍歷到#就彈出棧頂元素。這一步依舊可以采取string模擬,避免reverse。?

時間復雜度:O(n+m),n和m分別為s,t的長度,遍歷兩個字符串各一次

空間復雜度:O(m+n),處理字符串時,最壞情況下兩者都沒有退格符

bool _backspaceCompare(string s, string t) 
{return reBulidString(s) == reBulidString(t);
}string reBulidString(string str)
{string ret;for(auto e : str){if(e == '#' && ret.size()) ret.pop_back();else if(e != '#') ret.push_back(e);}return ret;
}

?解法2:雙指針

? ? ? ? 因為退格符只會對前面的字符產生影響,所以我們可以逆序遍歷字符串。?我們分別定義skipS和skipT來記錄當前的退格次數。如果如果#則skipS++,如果遍歷到普通字符,則看skipST是否為0,如果為0,則表示這個字符肯定會留下來,接著就去遍歷t字符串,找到一個不會被刪除的字符,然后判斷這兩個字符是否相等。如果不相等,則返回false;如果一個字符串為空了,另一個還有,則也返回false。

但是有一種情況需要注意,如果兩個字符串最后一個字符是#,或者最后一個字符被刪除了,此時兩者都越界了,此時返回true。

時間復雜度:O(m+n)

空間復雜度:O(1)

    bool backspaceCompare(string s, string t) {int i = s.size() - 1, j = t.size() - 1;int skipS = 0, skipT = 0;while(i >= 0 || j >= 0) // 這里為什么是或{// 在S中尋找不會被刪除的字符while(i>=0){if(s[i] == '#') skipS++, i--;else if(skipS) skipS--, i--;else break; // 退出該循環說明當前這個字符不會被刪除}// 在T中尋找不會被刪除的字符while(j>=0){if(t[j] == '#') skipT++, j--;else if(skipT) skipT--, j--;else break; // 當前字符不會被刪除}if(i>=0 && j>=0){if(s[i] != t[j]) return false;}else if(i>=0 || j>=0) return false;i--, j--;}return true;}

3.基本計算器2?

解法:棧模擬

?????????我們有可能會遇到空格,數字或者運算符,因為優先級的原因,我們如果遇到+/-時不能直接計算,我們采取的策略是將其先放入到棧中,為了避免+/-的運算不同,所以如果是+號,則直接存儲到棧中,如果是-號,則將其相反數壓入棧中。這樣棧中的元素只需要進行加法運算即可。

如果遇到乘號或者除法,則我們直接將后面的數乘或除到棧頂元素上。等遍歷完字符串后,直接將棧中的元素加起來即可。

需要注意的是,數字并不只是一位數,所以我們在遇到數字,需要將后面的數字也提取出來,并且要注意位數。

時間復雜度:O(n)

空間復雜度:O(n)

class Solution 
{
public:int calculate(string s) {   stack<int> calc;// 處理運算符char option = '+'; //第一個數前面的運算符被視為加號for (int i = 0; i < s.size();){// 處理空格if(s[i] == ' '){i++;}else if(isdigit(s[i]))//先獲取數字,數字可能是多位數{int tmp = 0;while(i<s.size() && isdigit(s[i])){tmp = tmp*10 + (s[i++]-'0');}//判斷該數前面的符號是什么// 加減直接將數字壓入棧中,減法壓入負數// 乘除讓棧頂數據*= / /= 上當前的數字if(option == '+') calc.emplace(tmp);else if(option == '-') calc.emplace(-tmp);else if(option == '*') calc.top() *= tmp;else calc.top() /= tmp;}else // 如果是操作符,則更新操作符{option = s[i];i++;}}// 棧中的元素使用加法計算即可int ret = 0;while (!calc.empty()){ret += calc.top();calc.pop();}return ret;}
};

4.字符串解碼?

我們在進行解碼的時候要從最內部開始解碼,因為最外層的方括號內部可能還嵌套這其他方括號。

解法:棧+分類討論

? ? ? ? 我們在遍歷字符串的時候,可能遇到數字,左方括號,右方括號,和字母。而我們要分別存儲數字和字母,所以借助兩個棧來實現。

如果遇到數字,我們就提取該數字,因為可能是多位數,所以要循環提取,然后將該數壓入到數字棧中。

如果遇到了左括號,我們接下來就提取字符串,然后壓入到字符棧中。

如果遇到了右括號,說明這是最內層的,此時就可以進行解析。解析之后,我們還得將該結果接到棧頂元素的后面。

如果遇到了字母,則提取該字母,因為該字母并沒有出現在括號中,所以沒有進行重復,直接插入到棧頂元素的后面即可。

細節:因為字符棧有可能為空,這時向棧頂元素后面加上字符就會報錯。所以我們可以提前給棧頂元素壓入一個空串。避免這種情況。

時間復雜度:O(S),除了遍歷原字符串,每一次解碼都會將其連接到棧頂元素。

空間復雜度:O(S),解碼后的字符串長度?

class Solution
{
public:string decodeString(string s){stack<int> nst;stack<string> sst;sst.emplace("");int i = 0, n = s.size();while (i < n){// 1.如果遇到數字,則提取數字放入數字棧中if (isdigit(s[i])){int tmp = 0;while (i < n && isdigit(s[i]))tmp = tmp * 10 + (s[i++] - '0');nst.emplace(tmp);}// 2.如果是左括號,則提取左括號后面的字符串else if (s[i] == '['){i += 1;string t;while (i < n && s[i] <= 'z' && s[i] >= 'a')t += s[i++];sst.emplace(t);}// 3.如果是右括號,則拿出兩個棧的棧頂進行解析,并將解析后的結果接到sst棧頂的后面else if (s[i] == ']'){//解析string t;int count = nst.top();nst.pop();while (count--) t += sst.top();sst.pop();//更新sst.top() += t;i++;// 遍歷下一個位置}// 4.如果直接遇到字母,則直接加到字符棧頂元素的后面else{string t;while (i < n && s[i] <= 'z' && s[i] >= 'a')t += s[i++];sst.top() += t;}}return sst.top();}
};

5.驗證棧序列?

這道題在學習棧的時候是經常會遇到的一道題,判斷入棧順序能否滿足出棧順序。?

解法:模擬

? ? ? ? 我們按照入棧順序進行入棧,然后判斷棧頂元素與出棧元素是否相等,如果相等,則出棧,然后指針指向下一個出棧元素。如果不相等,則繼續入棧。

如果最后棧為空,則說明滿足,否則不滿足。

時間復雜度:O(n)

空間復雜度:O(n)

class Solution 
{
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;for(int i=0, j=0; i<pushed.size(); ++i){st.emplace(pushed[i]);while(!st.empty() && st.top() == popped[j]){st.pop();j++;}}return st.empty();}
};

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

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

相關文章

conda的基本使用及pycharm里設置conda環境

創建conda環境 conda create --name your_env_name python3.8 把your_env_name換成實際的conda環境名稱&#xff0c;python后邊的根據自己的需要&#xff0c;選擇python的版本。 激活conda環境 conda activate your_env_name 安裝相關的包、庫 conda install package_name …

Python基于深度學習的多模態人臉情緒識別研究與實現

一、系統架構設計 A[數據采集] --> B[預處理模塊] B --> C[特征提取] C --> D[多模態融合] D --> E[情緒分類] E --> F[系統部署] F --> G[用戶界面] 二、數據準備與處理 1. 數據收集 - 視頻數據&#xff1a;FER2013&#xff08;靜態圖像&#xff0…

synchronized與 Java內置鎖(未寫完)

文章目錄 一、 synchronized 關鍵字二、Java對象結構1. 對象頭2. 對象體3. 對齊字節4. 對象頭中的字段長度5. Mark Word 的結構信息6. 使用 JOL 工具查看對象的布局 三、Java 內置鎖機制3.1 內置鎖的演進過程1. 無鎖狀態2. 偏向鎖狀態3. 輕量級鎖狀態4. 重量級鎖狀態 一、 sync…

LLM(3): Transformer 架構

Transformer 架構是當前大語言模型的主力架構和基礎技術&#xff0c;本文以通俗易懂的方式&#xff0c;對此作簡要介紹。 1.4 介紹 Transformer 架構 大多數現代的大規模語言模型&#xff08;LLMs&#xff09;依賴于 Transformer 架構&#xff0c;這是一種在 2017 年的論文《…

11.【.NET 8 實戰--孢子記賬--從單體到微服務--轉向微服務】--微服務基礎工具與技術--Ocelot 網關--整合日志

網關作為微服務架構的入口&#xff0c;承載著各服務間的請求轉發與安全校驗&#xff0c;其日志信息尤為關鍵。通過整合網關日志&#xff0c;可以將分散在不同系統中的訪問記錄、錯誤提示和異常信息集中管理&#xff0c;為問題排查提供全景視角。在排查故障時&#xff0c;統一日…

88.HarmonyOS NEXT 性能監控與調試指南:構建高性能應用

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; HarmonyOS NEXT 性能監控與調試指南&#xff1a;構建高性能應用 文章目錄 HarmonyOS NEXT 性能監控與調試指南&#xff1a;構建高性能應用1. 性能監…

012---狀態機的基本知識

1. 摘要 文章為學習記錄。主要介紹狀態機概述、狀態轉移圖、狀態編碼、狀態機寫法、狀態機代碼示例。 2. 狀態機概述 狀態機 &#xff08;Finite State Machine&#xff09;&#xff0c;也稱為同步有限狀態機&#xff0c;用于描述有先后順序或時序規律的事情。 “同步”&…

deepseek+kimi做ppt教程記錄

1.首先注冊deepseek和kimi deepseek官網&#xff1a;https://chat.deepseek.com/ kimi官網&#xff1a;https://kimi.moonshot.cn/ 以下以一篇工作總結報告為例 2.使用deepseek生成ppt大綱 讓deepseek生成kimi生成ppt所需要的內容時&#xff0c;需要注意提示詞內容&#xff0c;…

Java Module介紹

Java模塊系統自Java 9開始引入&#xff0c;旨在提供更強大的封裝機制、清晰的依賴關系定義以及可靠的配置。Java平臺本身也被模塊化了&#xff0c;提供了多個核心模塊以及其他用于支持不同功能的模塊。以下是一些重要的Java標準模塊&#xff1a; java.base - 這是最基礎的模塊…

SOME/IP:用Python實現協議訂閱、Offer、訂閱ACK與報文接收

文章目錄 前言一、代碼層次二、詳細代碼1. eth_scapy_sd.py2、eth_scapy_someip.py3、network_define.py4、packet_define.py5、unpack_define.py6、someip_controller.py 前言 1、需要pip安裝scapy庫 2、需要修改根據實際情況配置network_define.py 3、執行someip_controller…

【Linux內核系列】:文件系統收尾以及軟硬鏈接詳解

&#x1f525; 本文專欄&#xff1a;Linux &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 世界上只有一種個人英雄主義&#xff0c;那么就是面對生活的種種失敗卻依然熱愛著生活 內容回顧 那么在之前的學習中&#xff0c;我們…

最新版Chrome瀏覽器加載ActiveX控件技術--allWebPlugin中間件一鍵部署瀏覽器擴展

allWebPlugin簡介 allWebPlugin中間件是一款為用戶提供安全、可靠、便捷的瀏覽器插件服務的中間件產品&#xff0c;致力于將瀏覽器插件重新應用到所有瀏覽器。它將現有ActiveX控件直接嵌入瀏覽器&#xff0c;實現插件加載、界面顯示、接口調用、事件回調等。支持Chrome、Firefo…

基于SpringBoot和MybatisPlus實現通用Controller

基于SpringBoot和MybatisPlus實現通用Controller&#xff0c;只需要創建實體類和mapper接口&#xff0c;單表增刪改查接口就已經實現&#xff0c;提升開發效率 1.定義通用controller package com.xian.controller;import cn.hutool.core.map.MapUtil; import com.baomidou.my…

Axure大屏可視化原型模板及素材:數據可視化的高效解決方案

數據可視化已成為企業決策、運營分析、市場洞察的重要工具。數據可視化大屏&#xff0c;作為數據展示和交互的直觀平臺&#xff0c;能夠實時呈現關鍵數據&#xff0c;幫助企業快速做出決策。Axure作為原型設計領域的領先工具&#xff0c;以其豐富的組件庫、強大的交互設計能力和…

YOLOE:實時查看任何事物

摘要 https://arxiv.org/pdf/2503.07465v1 目標檢測和分割在計算機視覺應用中得到了廣泛應用&#xff0c;然而&#xff0c;盡管YOLO系列等傳統模型高效且準確&#xff0c;但它們受限于預定義的類別&#xff0c;阻礙了在開放場景中的適應性。最近的開放集方法利用文本提示、視覺…

【品鉑科技工業生產應用案例解析】

品鉑科技&#xff08;Pinpoint&#xff09;在工業領域的高精度定位解決方案已廣泛應用于電力、鋼鐵、倉儲、化工、地鐵等場景&#xff0c;以下為典型應用案例及技術方案&#xff1a; 一、?電力行業&#xff1a;上海閔行電廠人員定位? 白鶴灘水力發電站 ?項目需求?&#x…

7-Zip 功能介紹

7-Zip 是一款開源、高效的文件壓縮與解壓縮工具&#xff0c;支持多種格式&#xff0c;以高壓縮率和靈活性著稱。以下是其核心功能&#xff1a; 多格式支持 壓縮 / 解壓&#xff1a;支持 7z&#xff08;默認格式&#xff0c;壓縮率極高&#xff09;、ZIP、RAR、GZIP、BZIP2、TAR…

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能 ? 網站管理功能&#xff1a; 支持創建和管理多個網站。配置虛擬主機&#xff08;Vhost&#xff09;和域名綁定。自動安裝常用應用&#xff08;如WordPress、Joomla等&#xff09;。 ? 文件管理功能&#xff1a; 文件上傳、…

小語言模型(SLM)技術解析:如何在有限資源下實現高效AI推理

引言&#xff1a;為什么小語言模型&#xff08;SLM&#xff09;是2025年的技術焦點&#xff1f; 2025年&#xff0c;人工智能領域正經歷一場“由大變小”的革命。盡管大語言模型&#xff08;LLM&#xff09;如GPT-4、Gemini Ultra等在復雜任務中表現驚艷&#xff0c;但其高昂的…

jmeter:登錄接口的token用于下一個接口

問題&#xff1a; 僅僅登錄接口可以使用&#xff0c;其他接口進行測試的時候都是報錯&#xff1a;賬號已經失效 原因&#xff1a; 應該是登錄接口的token并沒有用到下一個接口上來 解決方法 1、目錄建設如下&#xff1a; 2、先添加一個后置處理器&#xff1a;查看結果數&…