【LeetCode 熱題 100】394. 字符串解碼

Problem: 394. 字符串解碼
給定一個經過編碼的字符串,返回它解碼后的字符串。
編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重復 k 次。注意 k 保證為正整數。
你可以認為輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認為原始數據不包含數字,所有的數字只表示重復的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N + M)
    • 空間復雜度:O(N) 或 O(M)

整體思路

這段代碼旨在解決一個涉及嵌套結構的 字符串解碼 (Decode String) 問題。編碼規則是 k[encoded_string],表示 encoded_string 這部分內容重復 k 次。由于括號可以嵌套,例如 3[a2[c]],這個問題具有天然的遞歸或棧式結構。

該算法巧妙地采用了 雙棧(Two Stacks) 的迭代方法來處理這種嵌套關系,避免了顯式遞歸。

  1. 數據結構選擇

    • strStack (字符串棧): 用于保存遇到 [ 之前的字符串部分。當解碼一個內部括號時,棧頂的字符串就是其解碼結果需要拼接的前綴。
    • numStack (數字棧): 用于保存與 [ 對應的重復次數 k
    • StringBuilder curr: 用于高效地構建當前正在處理的、位于同一嵌套層級的字符串。
    • int k: 一個臨時變量,用于解析可能由多位數字組成的重復次數。
  2. 核心遍歷與狀態管理邏輯

    • 算法通過單次遍歷輸入字符串 s 的每個字符來驅動。根據字符的類型,執行不同的狀態轉換:
      • 遇到數字 ('0'-'9'): 將其累加到 k 變量中。k = k * 10 + c - '0' 這個技巧可以正確地解析多位數(如 “10”, “123”)。
      • 遇到左括號 ('['): 這標志著進入了一個新的、更深的嵌套層級。此時,必須“保存”當前層級的狀態,以便稍后恢復。
        • 將當前的重復次數 k 壓入 numStack
        • 將當前已經構建好的字符串 curr 壓入 strStack
        • 重置 kcurr,為新的嵌套層級做準備。
      • 遇到右括號 (']'): 這標志著一個嵌套層級的結束。此時,需要“恢復”上一層級的狀態并執行解碼。
        • numStack 彈出重復次數 repeat
        • strStack 彈出上一層級的字符串前綴 prev
        • 將當前 curr 所代表的字符串重復 repeat 次。
        • 將重復后的字符串與前綴 prev 合并,形成新的 curr。這就完成了從內層到外層的解碼與合并。
      • 遇到字母 (else): 這是一個普通字符,直接追加到當前層級的字符串構建器 curr 的末尾。
  3. 返回結果

    • 當遍歷完整個輸入字符串后,curr 中就包含了完全解碼后的最終字符串,將其返回即可。

這個雙棧方法優雅地模擬了遞歸調用過程:[ 相當于遞歸深入,] 相當于遞歸返回。

完整代碼

class Solution {/*** 解碼一個按特定規則編碼的字符串。* @param s 編碼后的字符串,例如 "3[a2[c]]"* @return 解碼后的字符串,例如 "accaccacc"*/public String decodeString(String s) {// strStack: 用于保存遇到'['之前的字符串部分,作為解碼時的前綴。Deque<String> strStack = new ArrayDeque<>();// numStack: 用于保存'['前的重復次數 k。Deque<Integer> numStack = new ArrayDeque<>();// k: 臨時變量,用于解析可能的多位數字。int k = 0;// curr: 一個 StringBuilder,用于高效地構建當前嵌套層級的字符串。StringBuilder curr = new StringBuilder();// 遍歷輸入字符串的每一個字符for (char c : s.toCharArray()) {if (c >= '0' && c <= '9') {// 如果是數字,更新 k 的值。k * 10 的技巧可以處理多位數。k = k * 10 + c - '0';} else if (c == '[') {// 如果是左括號,表示進入新的嵌套層級。// 1. 將當前的重復次數 k 壓入數字棧numStack.push(k);// 2. 將當前已構建的字符串 curr 壓入字符串棧strStack.push(curr.toString());// 3. 重置 k 和 curr,為新層級做準備k = 0;curr = new StringBuilder();} else if (c == ']') {// 如果是右括號,表示一個嵌套層級結束,需要解碼。// 1. 彈出該層級對應的重復次數int repeat = numStack.pop();// 2. 彈出上一層的字符串前綴String prev = strStack.pop();// 3. 將當前層級的字符串(curr)重復指定次數String repeated = curr.toString().repeat(repeat);// 4. 將重復后的字符串與前綴合并,更新為新的當前層字符串curr = new StringBuilder(prev + repeated);} else {// 如果是普通字母,直接追加到當前層級的字符串中curr.append(c);}}// 循環結束后,curr 中即為最終完全解碼的字符串return curr.toString();}
}

時空復雜度

時間復雜度:O(N + M)

  1. N 的部分:算法的主體是一個 for 循環,它遍歷輸入字符串 s 一次。設 s 的長度為 N。這個掃描過程本身是 O(N) 的。
  2. M 的部分
    • 在循環內部,最耗時的操作是 curr.toString().repeat(repeat) 和隨后的字符串拼接。
    • 這些操作的總成本不取決于 N,而是取決于最終解碼后字符串的長度,我們稱之為 M
    • 每一個最終生成在結果字符串中的字符,都是通過 appendrepeat 操作產生的。所有這些生成操作的總和與最終字符串的長度 M 成正比。
  3. 綜合分析
    • 總時間復雜度是掃描輸入字符串的時間加上生成輸出字符串的時間。
    • 因此,最終的時間復雜度為 O(N + M),其中 N 是輸入字符串的長度,M 是輸出字符串的長度。

空間復雜度:O(N) 或 O(M)

  1. 主要存儲開銷:空間主要由兩個棧 strStacknumStack 以及 StringBuilder curr 占用。
  2. 空間大小
    • numStack 的大小與嵌套深度成正比,最多為 O(N)。
    • strStack 存儲的是中間的字符串片段。在最壞的情況下,例如 2[a2[b2[c...]]],棧中存儲的字符串總長度可能與最終輸出字符串的長度 M 相關。
    • 然而,在更典型的情況下,例如 a[b[c...]],棧中存儲的字符串總長度(“a”, “ab”, “abc” …)可以被輸入長度 N 所限制。
    • 考慮到各種情況,一個比較合理的上界是 O(N + M),但通常在分析中會簡化為 O(N)O(M),這取決于哪一個在特定用例中是主導因素。在大多數面試場景下,將其分析為 O(N) 是被接受的,因為它與輸入的規模和結構直接相關。

綜合分析
算法的輔助空間復雜度主要由棧的內容決定,其大小與輸入的嵌套深度和字符串片段長度有關。一個合理的估計是 O(N)

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

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

相關文章

Activity之間互相發送數據

activity_send_data_req.xml<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

設計模式:訪問者模式 Visitor

目錄前言問題解決方案結構代碼前言 訪問者是一種行為設計模式&#xff0c;它能將算法與其所作用的對象隔離開來。 問題 假如你的團隊開發了一款能夠使用巨型圖像中地理信息的應用程序。 圖像中的每個節點既能代表復雜實體&#xff08;例如一座城市&#xff09;&#xff0c; 也…

OpenCV 學習探秘之四:從角點檢測,SIFT/SURF/ORB特征提取,目標檢測與識別,Haar級聯分類人臉檢測,再到機器學習等接口的全面實戰應用與解析

書接上回&#xff0c;前面介紹了一些基本應用&#xff0c;本篇則著重介紹一些比較復雜的應用。 附&#xff1a;本文所用例子中使用的Opencv庫OpenCV4.5.4版本編譯好的庫 五、特征提取與描述 5.1 角點檢測&#xff1a;Harris 角點和 Shi-Tomasi 角點 5.1.1 Harris 角點檢測&a…

《秋招在即!Redis數據類型面試題解析》

博客主頁&#xff1a;天天困啊系列專欄&#xff1a;面試題關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Redis中常見的基礎數據結構總共五種&#xff1a;這五種類型分別為String&#xff…

政務網站內容檢測系統對錯敏信息有什么作用

政務網站內容檢測系統在錯敏信息管理中發揮著重要作用&#xff0c;能夠有效提升政府網站的信息安全性與合規性。以下從錯敏信息的作用及蟻巡政務信息巡查系統的功能特點兩方面進行說明。一、政務網站內容檢測系統對錯敏信息的作用1、實時監測與識別內容檢測系統通過智能化技術對…

Tower of Hanoi 漢諾塔

題目描述The Tower of Hanoi game consists of three stacks (left, middle and right) and n round disks of different sizes. Initially, the left stack has all the disks, in increasing order of size from top to bottom. The goal is to move all the disks to the r…

在 Docker 中啟動 Nginx 并掛載配置文件到宿主機目錄

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 在 Docker 中啟動 Nginx 并掛載配置文件到宿主機目錄前言一、創建宿主機目錄存放 Nginx 配置1.1 在宿主機&#xff08;如 Windows 或 Linux&#xff09;上創建目錄&#xff0…

認識ansible(入門)

什么是ansible&#xff1f;Ansible是一款自動化運維工具&#xff0c;基于Python開發&#xff0c;集合了眾多運維工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的優點&#xff0c;實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基于模塊…

Apache Ignite 關于 **Executor Service(執行器服務)** 的介紹

這段內容是 Apache Ignite 關于 Executor Service&#xff08;執行器服務&#xff09; 的介紹。我們可以把它理解為&#xff1a;一個分布式的“線程池”&#xff0c;可以把任務分發到集群中的多個節點上去執行。 下面我用通俗易懂的方式幫你徹底理解這個概念。&#x1f310; 什…

應用Builder模式在C++中進行復雜對象構建

引言 在軟件開發中&#xff0c;構建復雜對象時常常會遇到構造函數或setter方法過于復雜的情況。Builder模式作為一種創建型設計模式&#xff0c;能夠有效地解決這一問題。Guoyao 創建的勇勇(YongYong)角色&#xff0c;通過Builder模式實現了對復雜對象的構建過程與表示的分離&a…

gradio作為原型工具

存在的問題&#xff0c;頁面的展示和value不是同一個值的問題&#xff0c;比如說選中了北京&#xff0c;但實際上后端想要的是110000地區碼。 在實際開發中&#xff0c;前端展示給用戶的是可讀的地區名稱&#xff08;如“北京”&#xff09;&#xff0c;而背后處理時通常需要的…

計算聲子譜

準備的還是vasp的必備文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代碼可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…

深度學習 目標檢測常見指標和yolov1分析

目錄 一、常見指標 1、IoU 2、Confidence置信度 3、精準度和召回率 4、mAP 5、NMS方法 6、檢測速度 前傳耗時 FPS 7、FLOPs 二、YOLOv1 檢測流程 1、圖像網格劃分 2、類別預測 3、輸出張量 損失函數 優點 缺點 如題&#xff0c;這篇介紹一下目標檢測中常見的…

31. 偽類和偽元素區別

總結 選擇對象不同內容說明偽類作用對象元素的狀態或位置偽元素作用對象元素的一部分內容或虛擬內容是否新增節點均不新增節點常用符號:&#xff08;偽類&#xff09;、::&#xff08;偽元素&#xff09;推薦場景偽類用于交互與狀態控制&#xff1b;偽元素用于樣式修飾與內容插…

ChatGPT、Playground手動模擬Agent摘要緩沖混合記憶功能

01. 摘要緩沖混合記憶 摘要緩沖混合記憶中&#xff0c;所需的模塊有&#xff1a; chat_message_history&#xff1a;存儲歷史消息列表。moving_summary_buffer&#xff1a;移除消息的匯總字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;…

全國青少年信息素養大賽(無人飛行器主題賽(星際迷航)游記)

作者 FHD_WOLF 發布時間 2025-07-30 21:31 分類 生活游記 騎你的 白馬啊 行你欲行的路 風吹來 花落涂 點一欉香祈求 ---------萬千花蕊慈母悲哀從考場出來&#xff0c;剩下的只有無盡極樂 考前準備&#xff1a; 1.電腦充電。 &#xff08;這個賽項需要自帶設備&#x…

Kubernetes (K8s) 部署資源的完整配置OceanBase

Kubernetes Deployment 配置&#xff08;oceanbase-deployment.yaml&#xff09; # oceanbase-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: oceanbase-deployment spec:replicas: 1selector:matchLabels:app: oceanbasetemplate:metadata:labels:app…

ACS-電機控制Buffer-任意路徑規劃(PVSPLINE繪制圓形)

該程序是一個雙軸運動&#xff0c;繪制圓形 原始程序&#xff08;可以直接使用&#xff09; GLOBAL INT X1,Y1,ii GLOBAL REAL MY_ARRAY(4)(12) GLOBAL REAL piX1 0; Y1 1 ! Axis assignment pi ACOS(-1) ! Shortcut for generating piii 0 LOOP 12MY_ARRAY(0)(ii) COS(…

MongoDB Change Streams 實時數據變更流處理實戰指南

MongoDB Change Streams 實時數據變更流處理實戰指南 業務場景描述 在大型電商平臺或高并發的在線系統中&#xff0c;業務數據的變更&#xff08;如訂單狀態、庫存變動、用戶行為日志&#xff09;需要實時通知下游系統&#xff0c;以便做流式分析、緩存更新或消息推送。傳統的輪…

TIME WEAVER: A Conditional Time Series Generation Model論文閱讀筆記

TIME WEAVER: A Conditional Time Series Generation Model 摘要 想象一下&#xff0c;根據天氣、電動汽車的存在和位置生成一個城市的電力需求模式&#xff0c;這可以用于在冬季凍結期間進行容量規劃。這樣的真實世界的時間序列通常包含配對的異構上下文元數據&#xff08;天氣…