每日算法刷題Day51:7.21:leetcode 棧6道題,用時1h40min

二.進階

1.套路
2.題目描述

1.給你一個字符串 s 。它可能包含任意數量的 '*' 字符。你的任務是刪除所有的 '*' 字符。
當字符串還存在至少一個 '*' 字符時,你可以執行以下操作:

  • 刪除最左邊的 '*' 字符,同時刪除該星號字符左邊一個字典序 最小的字符。如果有多個字典序最小的字符,你可以刪除它們中的任意一個。
    請你返回刪除所有 '*' 字符以后,剩余字符連接而成的 字典序最小 的字符串(答案)
3.學習經驗
1. 3170. 刪除星號以后字典序最小的字符串(中等,學習)
思想

1.給你一個字符串 s 。它可能包含任意數量的 '*' 字符。你的任務是刪除所有的 '*' 字符。
當字符串還存在至少一個 '*' 字符時,你可以執行以下操作:

  • 刪除最左邊的 '*' 字符,同時刪除該星號字符左邊一個字典序 最小 的字符。如果有多個字典序最小的字符,你可以刪除它們中的任意一個。
    請你返回刪除所有 '*' 字符以后,剩余字符連接而成的 字典序最小 的字符串。
    2.此題和[[六.棧#7. 3412. 計算字符串的鏡像分數(中等)]]一樣,小寫字母就可以開二十六個棧,分別記錄每種字母的下標,此題難點在于同時刪除該星號字符左邊一個字典序 最小 的字符,即找到第一個下標棧不為空的字母,這就是要刪除的位置,彈出棧頂刪除完得到最終的棧后,先把保留下標合并到數組中,然后排序,最終賦值給結果
    3.可以優化為把待刪除的位置變成*號,然后直接調用字符串的removeerase函數刪除*即可,更快捷
代碼

合并獲取保留下標,然后排序,最后賦值給結果

class Solution {
public:string clearStars(string s) {int n = s.size();vector<vector<int>> stk(26);for (int i = 0; i < n; ++i) {int j = s[i] - 'a';if (s[i] != '*')stk[j].push_back(i);else {for (auto& st : stk) {if (!st.empty()) {st.pop_back();break;}}}}// 保留的下標vector<int> idx;// 先合并for (auto& st : stk)idx.insert(idx.end(), st.begin(), st.end());// 再排序sort(idx.begin(), idx.end());int m = idx.size();string res(m, '\0');for (int i = 0; i < m; ++i) {res[i] = s[idx[i]];}return res;}
};

把待刪除的位置變成*號,然后直接調用字符串的removeerase函數刪除*號:

class Solution {
public:string clearStars(string s) {int n = s.size();vector<vector<int>> stk(26);for (int i = 0; i < n; ++i) {int j = s[i] - 'a';if (s[i] != '*')stk[j].push_back(i);else {for (auto& st : stk) {if (!st.empty()) {s[st.back()] = '*'; // 變成'*'號st.pop_back();break;}}}}// remove+earse方法刪除所有'*'號s.erase(remove(s.begin(), s.end(), '*'), s.end());return s;}
};

三.鄰項消除

1.套路
2.題目描述
3.學習經驗

1.遇到某個連續子串要刪除,即遇到最后一項,判斷棧頂以下幾個元素是否匹配該子串,匹配則不斷彈出棧,否則最后一項入棧
2.遇到只能用一種連續字符串構造與還原問題[[六.棧#5. 1003. 檢查替換后的詞是否有效(中等)]]

1. 2696. 刪除子串后的字符串最小長度(簡單)

2696. 刪除子串后的字符串最小長度 - 力扣(LeetCode)

思想

1.給你一個僅由 大寫 英文字符組成的字符串 s
你可以對此字符串執行一些操作,在每一步操作中,你可以從 s 中刪除 任一個 "AB""CD" 子字符串。
通過執行操作,刪除所有 "AB""CD" 子串,返回可獲得的最終字符串的 最小 可能長度。
注意,刪除子串后,重新連接出的字符串可能會產生新的 "AB""CD" 子串。
2.此題就是遇到B,棧頂為A則出棧A,否則入B,遇到D,棧頂為C則出棧C,否則入D,其他字符均入棧

代碼
class Solution {
public:int minLength(string s) {int n = s.size();vector<char> stk;for (auto& ch : s) {if (ch == 'B') {if (!stk.empty() && stk.back() == 'A')stk.pop_back();elsestk.push_back(ch);} else if (ch == 'D') {if (!stk.empty() && stk.back() == 'C')stk.pop_back();elsestk.push_back(ch);} elsestk.push_back(ch);}return (int)stk.size();}
};
2. 1047. 刪除字符串中的所有相鄰重復項(簡單)

1047. 刪除字符串中的所有相鄰重復項 - 力扣(LeetCode)

思想

1.給出由小寫字母組成的字符串 s,重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。
s 上反復執行重復項刪除操作,直到無法繼續刪除。
在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。
2.待入棧的每個字符,棧不為空且棧頂等于該字符則棧頂出棧,否則該字符入棧

代碼
class Solution {
public:string removeDuplicates(string s) {int n = s.size();string stk;for (auto& ch : s) {if (!stk.empty() && stk.back() == ch)stk.pop_back();elsestk.push_back(ch);}return stk;}
};
3. 1544. 整理字符串(簡單)

1544. 整理字符串 - 力扣(LeetCode)

思想

1.給你一個由大小寫英文字母組成的字符串 s
一個整理好的字符串中,兩個相鄰字符 s[i]s[i+1],其中 0<= i <= s.length-2 ,要滿足如下條件:

  • s[i] 是小寫字符,則 s[i+1] 不可以是相同的大寫字符。
  • s[i] 是大寫字符,則 s[i+1] 不可以是相同的小寫字符。
    請你將字符串整理好,每次你都可以從字符串中選出滿足上述條件的 兩個相鄰 字符并刪除,直到字符串整理好為止。
    請返回整理好的 字符串 。題目保證在給出的約束條件下,測試樣例對應的答案是唯一的。
    **注意:空字符串也屬于整理好的字符串,盡管其中沒有任何字符。
代碼
class Solution {
public:string makeGood(string s) {int n = s.size();string stk;for (auto& ch : s) {if (!stk.empty() &&((ch >= 'A' && ch <= 'Z' && ch - 'A' + 'a' == stk.back()) ||(ch >= 'a' && ch <= 'z' && ch - 'a' + 'A' == stk.back())))stk.pop_back();elsestk.push_back(ch);}return stk;}
};
4. 3561. 移除相鄰字符(中等)

3561. 移除相鄰字符 - 力扣(LeetCode)

思想

1.給你一個由小寫英文字母組成的字符串 s
必須 在字符串 s 中至少存在兩個 連續 字符時,反復執行以下操作:

  • 移除字符串中 最左邊 的一對按照字母表 連續 的相鄰字符(無論是按順序還是逆序,例如 'a''b',或 'b''a')。
  • 將剩余字符向左移動以填補空隙。
    當無法再執行任何操作時,返回最終的字符串。
    **注意:字母表是循環的,因此 'a''z' 也視為連續。
代碼
class Solution {
public:string resultingString(string s) {int n = s.size();string stk;for (auto& ch : s) {int i = ch - 'a';if (!stk.empty() && ((i + 1) % 26 == (stk.back() - 'a') ||(i - 1 + 26) % 26 == (stk.back() - 'a')))stk.pop_back();elsestk.push_back(ch);}return stk;}
};

優化按照字母表 連續 的相鄰字符(無論是按順序還是逆序)的判斷方法:

abs(ch-stk.back())==1 || abs(ch-stk.back())==25
5. 1003. 檢查替換后的詞是否有效(中等)

1003. 檢查替換后的詞是否有效 - 力扣(LeetCode)

思想

1.給你一個字符串 s ,請你判斷它是否 有效
字符串 s 有效 需要滿足:假設開始有一個空字符串 t = "" ,你可以執行 任意次 下述操作將 t 轉換為 s

  • 將字符串 "abc" 插入到 t 中的任意位置。形式上,t 變為 tleft + "abc" + tright,其中 t == tleft + tright 。注意,tlefttright 可能為
    如果字符串 s 有效,則返回 true;否則,返回 false
    2.此題特征為只運行插入合法子串"abc",從而構造出s,現在讓我們去通過s反過來還原為t,即模式識別到這個合法子串就彈出
代碼
class Solution {
public:bool isValid(string s) {int n = s.size();string stk;for (auto& ch : s) {if (stk.size() >= 2 && ch == 'c' && stk.back() == 'b' &&stk[stk.size() - 2] == 'a') {stk.pop_back();stk.pop_back();} elsestk.push_back(ch);}return stk.empty();}
};

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

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

相關文章

網絡基礎DAY16-MSTP-VRRP

STP/RSTP的局限性1.所有VLAN共享一棵生成樹 2.無法實現不同VLAN在多條Trunk鏈路上的負載分擔 3.次優化二層路徑。MSTP的基本概念及優勢MSTP的定義MST域擁有相同MST配置標識的網橋構成的集合。 具體如何分辨是否是同一個域&#xff0c;就看域名&#xff0c;配置修訂號&#xff0…

freertos關鍵函數理解 uxListRemove

//刪除pxItemToRemove節點 UBaseType_t uxListRemove(ListItem_t *pxItemToRemove) { //The list item knows which list it is in. Obtain the list from the list item.//找到節點所在的鏈表//my_printf( "uxListRemove pxItemToRemove %#p\n", pxI…

C語言---番外篇(柔性數組)

前言&#xff1a; 由于這塊內容所謂綜合性比較高&#xff0c;有數組的知識&#xff0c;有結構體的知識&#xff0c;還有動態內存管理的知識&#xff0c;所以我就單獨寫一篇博客&#xff0c;此謂番外篇。 柔性數組的概念 定義在結構體的最后一個元素的位置且大小未知的數組就叫…

單片機的幾種GPIO輸入輸出模型詳解

模式選擇匯總參考表&#xff1a;模式輸出驅動輸入阻抗默認狀態典型應用場景推挽輸出強驅動禁用可配置LED, SPI, 高速信號開漏輸出弱驅動禁用低/懸空IC, 電平轉換, 線與浮空輸入禁用極高不確定外部強驅動信號上拉輸入禁用中高高電平按鍵(接地型), 數字輸入下拉輸入禁用中高低電平…

深度解析ECharts.js:構建現代化數據可視化的利器

引言&#xff1a;數據可視化的新時代挑戰 在數字化轉型浪潮中&#xff0c;數據可視化已成為企業決策和用戶體驗的關鍵環節。面對海量數據的呈現需求&#xff0c;傳統表格已無法滿足用戶對直觀洞察的渴求。作為百度開源的JavaScript可視化庫&#xff0c;ECharts.js憑借其強大的功…

從零構建實時通信引擎:Freeswitch源碼編譯與深度優化指南

一、構建工具&#xff1a;編譯FreeSWITCH及其依賴庫的基礎 1. CMake2. Autoconf 二、匯編器&#xff1a;提升音視頻處理性能 3. YASM / NASM 三、音視頻編解碼器&#xff1a;支撐實時媒體傳輸 4. Opus5. x264 (可選)6. libvpx / libvpx2 (可選) 四、多媒體框架與工具庫&#xf…

網絡原理 HTTP 和 HTTPS

目錄 一 . HTTP 協議 二 . 抓包 三 . HTTP 請求 / 響應的基本格式 &#xff08;1&#xff09;HTTP請求的基本格式 &#xff08;2&#xff09;HTTP響應的基本格式 四 . HTTP 方法 GET 和 POST 的區別&#xff1a; 五 . 請求報頭和響應報頭 &#xff08;1&#…

基于單片機的自動條幅懸掛機

摘 要 隨著日新月異科技發展&#xff0c;在心率體溫測量方面&#xff0c;我們取得了迅速的發展&#xff0c;就近日而言&#xff0c;脈搏測量儀已經在多個領域大展身手&#xff0c;除了在醫學領域有所建樹&#xff0c;在人們的日常生活方面的應用也不斷拓展&#xff0c;如檢疫…

《C++》面向對象編程--類(中)

文章目錄一、構造函數1.1定義1.2語法1.3特性二、析構函數2.1定義2.2語法2.3特性三、拷貝構造函數3.1定義3.2語法3.3特性3.4淺拷貝3.4.1定義3.4.2淺拷貝的風險3.5深拷貝一、構造函數 1.1定義 在C中&#xff0c;構造函數&#xff08;Constructor&#xff09; 是一種特殊的成員函…

機器學習初學者理論初解

大家好! 為什么手機相冊能自動識別人臉&#xff1f;為什么購物網站總能推薦你喜歡的商品&#xff1f;這些“智能”背后&#xff0c;都藏著一位隱形高手——機器學習&#xff08;Machine Learning&#xff09;。一、什么是機器學習&#xff1f;簡單說&#xff0c;機器學習是教計…

原碼反碼補碼

在Java中&#xff0c;無論是小數還是整數&#xff0c;他們都要帶有符號&#xff08;和C語言不同&#xff0c;C語言有無符號數&#xff09;。首位就作為符號位。原碼反碼&#xff1a;正數的反碼是其原碼本身負數的反碼是在其原碼的基礎上, 符號位不變&#xff0c;其余各個位取反…

使用ubuntu:20.04和ubuntu:jammy構建secretflow環境

一、使用ubuntu:20.04構建隱語編譯環境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(鉸鏈損失函數)詳解:SVM 中的關鍵損失函數

&#x1f4cc; 一、什么是 Hinge Loss&#xff1f;Hinge Loss&#xff08;鉸鏈損失&#xff09;&#xff0c;是 支持向量機&#xff08;SVM, Support Vector Machine&#xff09; 中常用的一種損失函數&#xff0c;用于最大間隔分類。其核心思想是&#xff1a;當預測結果已經正…

days32 :零基礎學嵌入式之網絡2.0

一、wireshark &#xff1a;網絡抓包工具1.功能&#xff1a;抓取通過電腦網卡的網絡數據2.作用&#xff1a;排查故障、抓取數據做數據分析、3.用法&#xff1a;&#xff08;1&#xff09;sudo wireshark&#xff08;2&#xff09;選擇需要抓取的網卡》any&#xff08;3&#xf…

數字護網:一次深刻的企業安全體系靈魂演練

&#x1f9e9; 引言&#xff1a;什么是“護網”&#xff1f;—— 不止是攻防&#xff0c;更是企業安全能力的年度大考 每年&#xff0c;由國家相關部門牽頭的“護網行動”都如期而至&#xff0c;各大企事業單位的安全團隊也隨之進入高度戒備狀態。然而&#xff0c;“護網”遠非…

基于 NumPy 的高效數值計算技術解析與實踐指引

在數據處理與科學計算領域&#xff0c;高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石&#xff0c;以高性能多維數組對象及配套函數&#xff0c;成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算&#xff0c;通過向量化操作直接處理每個元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的選舉 在 Kafka 集群中會有一個或多個 broker,其中有一個 broker 會被選舉為控制器(Kafka Controller)?,它負責管理整個集群中所有分區和副本的狀態。當某個分區的leader副本出現故障時,由控制器負責為該分區選舉新的leader副本…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ImageCarousel(圖片輪播組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ImageCarousel組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法以及 Tailwind CSS …

基于springboot的智能物流管理系統(源碼+論文)

一、開發環境 MYSQL數據庫 MySQL是一個真正的多用戶、多線程SQL數據庫服務器&#xff0c;基于SQL的客戶/服務器模式的關系數據庫管理系統。其特點包括&#xff1a; 功能強大&#xff1a;支持多用戶、多線程操作。使用簡單&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的詳細介紹以及底層原理——包括數據結構紅黑樹、二叉樹等,從0到徹底掌握Collection只需這篇文章

目錄 Collection簡介 Collection的遍歷方式 迭代器遍歷 增強for遍歷 Lambda表達式遍歷 List集合 List集合的遍歷方式 列表迭代器遍歷以及普通for循環 數據結構 棧 隊列 數組 鏈表 單向鏈表 雙向鏈表 二叉樹 遍歷方式 普通二叉樹 二叉查找樹 平衡二叉樹 旋轉…