2024.06.28 刷題日記

394. 字符串解碼

給定一個經過編碼的字符串,返回它解碼后的字符串。

示例 1:

輸入:s = “3[a]2[bc]”
輸出:“aaabcbc”

示例 2:

輸入:s = “3[a2[c]]”
輸出:“accaccacc”

示例 3:

輸入:s = “2[abc]3[cd]ef”
輸出:“abcabccdcdcdef”

示例 4:

輸入:s = “abc3[cd]xyz”
輸出:“abccdcdcdxyz”

這道題目感覺很不好做,我自己的解法很復雜,而且過不去一個測試點:

class Solution {
public:string decodeString(string s) {stack<string> st;int k = 0;string mode = "";string currentStr = "";for (char c : s) {if (isdigit(c)) {if (mode != "") {st.push(mode);mode = "";}k = k * 10 + c - '0';} else if (isalpha(c)) {if (k != 0) {st.push(to_string(k));k = 0;}mode += c;} else if (c == ']') { // 退棧、合并if (stringIsNum(st.top())) {// 如果棧頂是數字int num = stoi(st.top());st.pop();currentStr = mode;for (int i = 0; i < num - 1; i++) {currentStr += mode;}st.push(currentStr);currentStr = "";mode = "";} else { // 否則合并currentStr = st.top();st.pop();currentStr += mode;st.push(currentStr);currentStr = "";mode = "";}} else if (c == '[') {if (k != 0) {st.push(to_string(k));k = 0;}}}if (mode != "")st.push(mode);// 最后的處理currentStr = "";while (!st.empty()) {string topStr = st.top();st.pop();if (st.empty())return topStr;if (stringIsNum(st.top())) {currentStr = topStr;int num = stoi(st.top());st.pop();for (int i = 0; i < num - 1; i++) {currentStr += topStr;}st.push(currentStr);currentStr = "";} else {currentStr = topStr;topStr = st.top();currentStr = topStr + currentStr;st.pop();st.push(currentStr);}}return "";}private:bool stringIsNum(string& str) {try {int num = std::stoi(str);return true;} catch (const std::invalid_argument& e) {return false;}}
};

后面我想到了用兩個棧來解決這個問題,其中一個棧用來存儲字符串段,另一個棧用來存儲字符串段重復的次數。接下來的重點就是處理'['']'符號。

示例1:

對于s = "3[a]2[bc]":遇到'['的時候,入棧數字以及當前currentStr,并且置空;遇到']'的時候,取字符串段的 top 元素、重復次數棧的 top 元素,然后進行拼接。重復這個過程,currentStr 就是答案。

示例2:

對于s = "3[a2[c]]":也是同樣的操作。

class Solution {
public:string decodeString(string s) {stack<int> counts;     // 用于存儲重復次數stack<string> strings; // 用于存儲字符串段int k = 0;string currentStr = "";for (char c : s) {if (isdigit(c)) {k = k * 10 + (c - '0');} else if (isalpha(c)) {currentStr += c;} else if (c == '[') {// 遇到 '[' 時,將之前的數字和字符串推入棧中counts.push(k);strings.push(currentStr);k = 0;currentStr = "";} else if (c == ']') {// 遇到 ']' 時,開始構建字符串string temp = currentStr;currentStr = strings.top(); // 取出之前的字符串strings.pop();int count = counts.top(); // 取出重復次數counts.pop();for (int i = 0; i < count; i++) {currentStr += temp;}}}return currentStr; // 返回最終構建的字符串}
};

不禁要問,為什么可以這樣?這里不禁讓我想起了離散數學中的群論中的知識點,下面詳細分析下。

  • 操作數:我們首先定義操作數,很明顯這里的操作數為 string 以及 int
  • 操作:這里并沒有明確表明操作符號是什么,但是可以推斷隱含的操作符。當 int[string] 時,表明要將 string 重復 int 次;當 stringstring 的時候,表明它們需要拼接;至于string int這種運算不存在,因為 int 必須后面跟 string

因此,遇到'['的時候,這意味著將要計算int[string],將數字入棧,而且在數字入棧意味著數字前面還有一個 string ,不管這個 string 是否為空,無所謂。當遇到']'的時候,意味著int[string]要進行拼接了。

可以看到,這個道題目無非就是計算int[string]以及stringstring,因此這道題目和+*混合運算同構。

對于s = "3[a]2[bc]":可以同構為:s = 3*(a)+2*(bc);對于s = "3[a2[c]]",則可以同夠為:"s = 3*(a+2*(c))"

以上就是這道題目的內涵了。

總結(gpt4)

將字符串解碼問題與離散數學中的概念聯系起來,這是一種非常有趣的視角。確實,字符串解碼可以看作是對特定運算符(如拼接和重復)的遞歸運算。這種運算滿足一定的結合律,類似于群論中的一些運算屬性,盡管這里的操作并不構成嚴格數學意義上的群,因為群需要滿足閉合性、結合律、單位元存在以及每個元素存在逆元等條件。

提供的 C++ 代碼示例有效地實現了字符串解碼的功能,這里使用了兩個棧:一個存儲重復的次數(counts),另一個存儲到目前為止解析的字符串(strings)。這種方法非常適合處理嵌套的解碼結構。

深入理解:

每當遇到 '[' 時,把當前解析到的重復次數和字符串推入各自的棧中,并重置這些變量準備解析括號內的內容。當遇到 ']' 時,從棧中彈出最近的字符串和重復次數,并將解析到的字符串重復相應的次數,再與之前暫存的字符串拼接。

操作符和操作數的對應關系

  • 操作數:字符串和整數(重復次數)
  • 操作:兩種基本操作
    • int[string]:將字符串重復指定的次數
    • stringstring:將兩個字符串拼接起來

代碼確實很好地模擬了這一過程,但要注意一點細節上的問題:在字符串解碼結束后,如果主字符串(currentStr)后面沒有更多的操作,它將直接返回。這種情況下,代碼已經正確處理了所有情況。

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

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

相關文章

怎么進行模型微調,以微調llama3為例

微調模型&#xff08;Fine-tuning&#xff09;通常涉及以下步驟&#xff0c;以微調 LLaMA 3 為例&#xff1a; 1. 準備工作 在開始微調之前&#xff0c;需要準備以下工作&#xff1a; 選擇預訓練模型&#xff1a;LLaMA 3 是一個大型的語言模型&#xff0c;可以通過 Hugging F…

react 中 Swiper vertical 模式下 autoHeight 失效的問題

Swiper 在 vertical 模式下 autoHeight 失效的問題&#xff0c;導致頁面出現多余的空白高度&#xff0c;網上找了很多方法都無效&#xff0c;我直接暴力更改。 <SwiperclassNameindex-swiperdirection{vertical}mousewheel{true}centeredSlides{true}autoHeight{true}slide…

VS2019+QT5.12.10: error MSB4036: 未找到“Join”任務。請檢查下列各項: 1.) 項目文件中的任務名

1、背景 兩個VS2019打開兩個相同的項目&#xff0c;一個里可以正常運行&#xff0c; 一個中一直報錯&#xff0c;&#xff0c;報的錯也是瞎幾把報的。。 2、重新安裝插件 之前在VS的擴展中在線安裝了qt插件&#xff0c; 安裝了一半&#xff0c;比較慢&#xff0c;直接強行退出…

傳媒行業指哪些?需要過等保嗎?

傳媒&#xff0c;一個人人都接觸的行業。相信大家都聽過傳媒&#xff0c;但具體傳媒行業是指什么&#xff0c;包括哪些&#xff0c;詳細很多人都不了解。這不一些人在問&#xff0c;傳媒行業指哪些&#xff1f;需要過等保嗎&#xff1f;這里跟我們小編一起來討論討論吧&#xf…

玩游戲就能學習亞馬遜云科技AWS技術并通過熱門技術認證考試??

亞馬遜AWS限時活動&#xff0c;玩免費游戲Cloud Quest Practitioner送AWS云從業證書考試25%折扣券(價值171元)&#xff0c;玩游戲的同時還能學知識一舉兩得。Cloud Quest是AWS出的一款3D角色扮演游戲/虛擬城市建造形式的實驗課程(游戲畫面有點像天際線)&#xff0c;大家通過完成…

【01-02】Mybatis的配置文件與基于XML的使用

1、引入日志 在這里我們引入SLF4J的日志門面&#xff0c;使用logback的具體日志實現&#xff1b;引入相關依賴&#xff1a; <!--日志的依賴--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

338. 比特位計數(leetcode)

338. 比特位計數&#xff08;leetcode&#xff09; 題目描述 給你一個整數 n &#xff0c;對于 0 < i < n 中的每個 i &#xff0c;計算其二進制表示中 1 的個數 &#xff0c;返回一個長度為 n 1 的數組 ans 作為答案。 示例1 輸入&#xff1a;n 2 輸出&#xff1a;[0…

Sorting

本節提供有關在數據網格中對數據進行排序的信息。 GridControl-Grid View Sort Data 默認情況下&#xff0c;最終用戶可以按任何列對數據進行排序&#xff0c;但使用MemoExEdit、ImageEdit和PictureEdit在位編輯器的列除外。在運行時&#xff0c;單擊列標題一次以升序排列數…

中國電信股份有限公司江西分公司招聘信息 7.5日截止

法律事務管理(南昌) 學歷要求 本科及以上學歷 崗位職責 1.依據國家法律、法規和相關規章規定,為公司其他部門提供日常法律服務與支持; 2.負責公司各類合同審核工作; 3.負責公司法律文件的起草和法律事務談判; 4.圍繞與公司業務有關的法律問題及法…

如何在Java中實現分布式緩存?

如何在Java中實現分布式緩存&#xff1f; 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討在Java應用程序中如何實現分布式緩存&#xff0c;探…

【SQL注入】

SQL注入&#xff1a;通過可輸入/修改sql參數實現攻擊的過程 文章目錄 0x00 SQL注入漏洞原理0x01 前置知識1 SQL注入分類2 數據庫知識 0x02 是否存在SQL注入&#xff1f;0x03 不同SQL注入1. Union注入2. 盲注Blind3. base64注入 0x04 SQL注入繞過技術0x05 SQL防注入 0x00 SQL注入…

網絡爬蟲的應用場景

網絡爬蟲的應用場景 網絡爬蟲的應用場景在現代信息化社會中顯得尤為廣泛和重要。除了我們熟知的搜索引擎利用爬蟲技術抓取互聯網上的信息以提供用戶搜索服務外&#xff0c;還有許多其他領域也依賴于網絡爬蟲的高效運作。 在電商領域&#xff0c;網絡爬蟲被廣泛應用于價格監控…

最強文生圖模型Stable Diffusion 3 Medium 正式開源

Stability AI 宣布 Stable Diffusion 3 Medium 現已開源&#xff0c;是 Stable Diffusion 3 系列中最新、最先進的文本生成圖像 AI 模型 —— 官方聲稱是 “迄今為止最先進的開源模型”&#xff0c;其性能甚至超過了 Midjourney 6。 Stable Diffusion 3 Medium 模型規格參數達到…

獲取 url 地址欄 ? 后面的查詢字符串,并以鍵值對形式放到對象里面

寫在前面 在前端面試當中&#xff0c;關于 url 相關的問題很常見&#xff0c;而對于 url 請求參數的問題也很常見&#xff0c;大部分以筆試題常見&#xff0c;今天就根據這道面試題一起來看一下。 問題 獲取 url 地址欄?后面的查詢字符串&#xff0c;并以鍵值對形式放到對象…

[分布式網絡通訊框架]----MprpcController以及Logger類

在calluserservice.cc中&#xff0c;使用UserServiceRpc_Stub類的時候&#xff0c;我們最終調用形式為&#xff1a;stub.Login(&controller,&request,&response,nullptr); 注意到其中有一個controller對象&#xff0c;這個是由MprpcController類定義出來的對象&…

LLVM AliasAnalysis別名分析 TBAA TypeBasedAliasAnalysis

一、什么是別名分析 Alias Analysis (又名 Pointer Analysis)是用于確定兩個指針是否指向內存中的同一對象&#xff0c;這里有很多不同的別名分析算法&#xff0c;分為幾種類型&#xff1a;流敏感vs流非敏感、上下文敏感vs上下文非敏感、域敏感vs域非敏感、基于一致性的vs基于…

單片機學習(16)--直流電機驅動

直流電機驅動 15.1直流電機驅動基礎知識1.直流電機介紹2.電機驅動電路3.PWM介紹 15.2LED呼吸燈和直流電機調速1.LED呼吸燈代碼2.直流電機調速&#xff08;1&#xff09;產生PWM的方法&#xff08;2&#xff09;工程目錄&#xff08;3&#xff09;main.c函數 15.1直流電機驅動基…

isdecimal()方法——判斷字符串是否只包含十進制字符

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法參考 isdecimal()方法用于檢查字符串是否只包含十進制字符。這種方法只適用于unicode對象。 注意&#xff1a;定義一個十進制字符串&#xff0c…

linux高級編程(進程)(2)

父子進程的關系&#xff1a; 子進程是父進程的副本。子進程獲得父進程數據段&#xff0c;堆&#xff0c;棧&#xff0c;正文段共享。&#xff08;子分配了一塊新的內存&#xff0c;但是代碼段指向父進程&#xff0c;也就是說不論幾個子進程都只有一個code段&#xff09; …

SpringCloud中復制模塊然后粘貼,文件圖標缺少藍色方塊

再maven中點擊&#xff0b;號&#xff0c;把當前pom文件交給maven管理即可