国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

LeetCode 394:字符串解碼

算法與數據結構 ? 來源:吳師兄學算法 ? 作者:吳師兄學算法 ? 2022-08-31 15:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天的題目來源于 LeetCode 第 394 號問題:字符串編碼,難度為「中等」,根據評論區的反饋,近期華為面試、字節面試都出現過。

0a45d7d4-28dd-11ed-ba43-dac502259ad0.png0a61357e-28dd-11ed-ba43-dac502259ad0.png

一、題目描述

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

編碼規則為:k[encoded_string],表示其中方括號內部的encoded_string正好重復k次。注意k保證為正整數。

你可以認為輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認為原始數據不包含數字,所有的數字只表示重復的次數k,例如不會出現像3a2[4]的輸入。

示例 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"

提示:

  • 1 <= s.length <= 30
  • s由小寫英文字母、數字和方括號'[]'組成
  • s保證是一個有效的輸入。
  • s中所有整數的取值范圍為[1, 300]

二、題目解析

注意示例 2 ,可以發現字符串中存在括號內有嵌套括號的情況,這個時候,只有先把內層括號解碼成功,才能再去解碼外層括號。

0a7d0254-28dd-11ed-ba43-dac502259ad0.png

也就意味著后面訪問的括號比前面訪問的括號還更早的進行處理,與棧的先入后出特點對應。

所以,本題使用棧來處理。

具體操作如下:

1、構建兩個棧,一個是數字棧numStack,在遍歷編碼字符串過程中記錄出現的數字;一個是字符串棧strStack,在遍歷編碼字符串過程中記錄出現的字符串。

2、初始化兩個變量,一個是digit,用來記錄訪問到字符串之前出現的數字;一個是res,在訪問編碼字符串的過程中,把得到的結果存放到 res 中。

3、接下來,開始從頭到尾訪問編碼字符串,在訪問過程中,字符會出現 4 種情況。

0a9739d0-28dd-11ed-ba43-dac502259ad0.png

4、如果是數字,需要把字符轉成整型數字,然后更新到digit上,代表后續的字符串需要重復digit次。

5、如果是字符,說明它就出現一次,可以直接存放到 res 中。

6、如果是"[" ,這個時候出現了嵌套的內層編碼字符串,而外層的解碼需要等待內層解碼的結果,那么之前已經掃描的字符需要存放起來,等到內層解碼之后再重新使用。

0ab9202c-28dd-11ed-ba43-dac502259ad0.png

7、如果是"]" ,此時,內層解碼已經有結果,需要把它和前面的字符串進行拼接。

8、拼接的方式就是先通過 numsStack 的棧頂元素獲取重復的次數,再通過 strStack 的棧頂元素獲取前面的字符串。

9、最后返回 res 就行。

三、參考代碼

1、Java 代碼

//登錄AlgoMooc官網獲取更多算法圖解
//https://www.algomooc.com
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//字符串解碼(LeetCode394)//leetcode.cn/problems/decode-string/
classSolution{
publicStringdecodeString(Strings){

//創建數字棧,在遍歷編碼字符串過程中記錄出現的數字
DequenumStack=newLinkedList<>();

//創建字符棧,在遍歷編碼字符串過程中記錄出現的字符串
DequestrStack=newLinkedList<>();

//在訪問編碼字符串的過程中,用來記錄訪問到字符串之前出現的數字,一開始為0
intdigit=0;

//在訪問編碼字符串的過程中,把得到的結果存放到res中
StringBuilderres=newStringBuilder();

//從頭到尾遍歷編碼字符串
for(inti=0;i//在遍歷過程中,字符會出現4種情況

//先獲取此時訪問的字符
charch=s.charAt(i);

//1、如果是數字,需要把字符轉成整型數字
//注意數字不一定是1位,有可能是多位
//比如123a,在字母a的前面出現了123,表示a重復出現123次
//那么一開始ch為1,當訪問到ch為2的時候,1和2要組成數字12
//再出現3,12和3組成數字123
if(Character.isDigit(ch)){

//先將字符轉成整型數字ch-‘0’
//補充知識:將字符'0'-'9'轉換為數字,只需將字符變量減去'0'就行
//因為字符和數字在內存里都是以ASCII碼形式存儲的
//減去'0',其實就是減去字符'0'的ASCII碼,而字符'0'的ASCII碼是30
//所以減去'0'也就是減去30,然后就可以得到字符對應的數字了。
intnum=ch-'0';

//再將這個數字和前面存儲的數字進行組合
//1和2組成數字12,也就是1*10+2=12
//12和3組成數字123,也就是12*10+3=123
digit=digit*10+num;

//2、如果是字符
}elseif((ch>='a'&&ch<=?'z')){

//說明它就出現一次,可以直接存放到res中
res.append(ch);

//3、如果是"["
//出現了嵌套的內層編碼字符串,而外層的解碼需要等待內層解碼的結果
//那么之前已經掃描的字符需要存放起來,等到內層解碼之后再重新使用
}elseif(ch=='['){

//把數字存放到數字棧
numStack.push(digit);

//把外層的解碼字符串存放到字符串棧
strStack.push(res);

//開始新的一輪解碼
//于是,digit歸零
digit=0;

//res重新初始化
res=newStringBuilder();

//4、如果是"]"
}elseif(ch==']'){

//此時,內層解碼已經有結果,需要把它和前面的字符串進行拼接

//第一步,先去查看內層解碼的字符串需要被重復輸出幾次
//比如e3[abc],比如內層解碼結果abc需要輸出3次
//通過數字棧提取出次數
intcount=numStack.poll();

//第二步,通過字符串棧提取出之前的解碼字符串
StringBuilderoutString=strStack.poll();

//第三步,不斷的把內層解碼的字符串拼接起來
for(intj=0;j//拼接到outString后面,拼接count次
outString.append(res.toString());
}

//再把此時得到的結果賦值給res
res=outString;
}
}

//返回解碼成功的字符串
returnres.toString();
}
}

2、C++ 代碼

classSolution{
public:
stringdecodeString(strings){
//創建數字棧,在遍歷編碼字符串過程中記錄出現的數字
stack<int>numStack;

//創建字符棧,在遍歷編碼字符串過程中記錄出現的字符串
stack<string>strStack;

//在訪問編碼字符串的過程中,用來記錄訪問到字符串之前出現的數字,一開始為0
intdigit=0;

//在訪問編碼字符串的過程中,把得到的結果存放到res中
stringres;

//從頭到尾遍歷編碼字符串
for(inti=0;i//在遍歷過程中,字符會出現4種情況

//先獲取此時訪問的字符
charch=s[i];
//1、如果是數字,需要把字符轉成整型數字
//注意數字不一定是1位,有可能是多位
//比如123a,在字母a的前面出現了123,表示a重復出現123次
//那么一開始ch為1,當訪問到ch為2的時候,1和2要組成數字12
//再出現3,12和3組成數字123
if(ch>='0'&&ch<='9'){

//先將字符轉成整型數字ch-‘0’
//補充知識:將字符'0'-'9'轉換為數字,只需將字符變量減去'0'就行
//因為字符和數字在內存里都是以ASCII碼形式存儲的
//減去'0',其實就是減去字符'0'的ASCII碼,而字符'0'的ASCII碼是30
//所以減去'0'也就是減去30,然后就可以得到字符對應的數字了。
intnum=ch-'0';

//再將這個數字和前面存儲的數字進行組合
//1和2組成數字12,也就是1*10+2=12
//12和3組成數字123,也就是12*10+3=123
digit=digit*10+num;

//2、如果是字符
}elseif((ch>='a'&&ch<=?'z')){

//說明它就出現一次,可以直接存放到res中
res+=ch;

//3、如果是"["
//出現了嵌套的內層編碼字符串,而外層的解碼需要等待內層解碼的結果
//那么之前已經掃描的字符需要存放起來,等到內層解碼之后再重新使用
}elseif(ch=='['){

//把數字存放到數字棧
numStack.push(digit);

//把外層的解碼字符串存放到字符串棧
strStack.push(res);

//開始新的一輪解碼
//于是,digit歸零
digit=0;

//res重新初始化
res="";

//4、如果是"]"
}elseif(ch==']'){

//此時,內層解碼已經有結果,需要把它和前面的字符串進行拼接

//第一步,先去查看內層解碼的字符串需要被重復輸出幾次
//比如e3[abc],比如內層解碼結果abc需要輸出3次
//通過數字棧提取出次數
intcount=numStack.top();

numStack.pop();

//第二步,通過字符串棧提取出之前的解碼字符串
stringoutString=strStack.top();

strStack.pop();

//第三步,不斷的把內層解碼的字符串拼接起來
for(intj=0;j//拼接到outString后面,拼接count次
outString+=res;
}

//再把此時得到的結果賦值給res
res=outString;
}
}

//返回解碼成功的字符串
returnres;
}
};

3、Python 代碼

classSolution:
defdecodeString(self,s:str)->str:
#創建數字棧,在遍歷編碼字符串過程中記錄出現的數字
numStack=[]

#創建字符棧,在遍歷編碼字符串過程中記錄出現的字符串
strStack=[]

#在訪問編碼字符串的過程中,用來記錄訪問到字符串之前出現的數字,一開始為0
digit=0

#在訪問編碼字符串的過程中,把得到的結果存放到res中
res=""

#從頭到尾遍歷編碼字符串
forchins:

#在遍歷過程中,字符會出現4種情況
#先獲取此時訪問的字符
#1、如果是數字,需要把字符轉成整型數字
#注意數字不一定是1位,有可能是多位
#比如123a,在字母a的前面出現了123,表示a重復出現123次
#那么一開始ch為1,當訪問到ch為2的時候,1和2要組成數字12
#再出現3,12和3組成數字123
if'0'<=?ch?<=?'9':

#先將字符轉成整型數字ch-‘0’
#補充知識:將字符'0'-'9'轉換為數字,只需將字符變量減去'0'就行
#因為字符和數字在內存里都是以ASCII碼形式存儲的
#減去'0',其實就是減去字符'0'的ASCII碼,而字符'0'的ASCII碼是30
#所以減去'0'也就是減去30,然后就可以得到字符對應的數字了。
num=int(ch)

#再將這個數字和前面存儲的數字進行組合
#1和2組成數字12,也就是1*10+2=12
#12和3組成數字123,也就是12*10+3=123
digit=digit*10+num

#2、如果是字符
elifch>='a'andch<=?'z':

#說明它就出現一次,可以直接存放到res中
res+=ch

#3、如果是"["
#出現了嵌套的內層編碼字符串,而外層的解碼需要等待內層解碼的結果
#那么之前已經掃描的字符需要存放起來,等到內層解碼之后再重新使用
elifch=='[':

#把數字存放到數字棧
numStack.append(digit)

#把外層的解碼字符串存放到字符串棧
strStack.append(res)

#開始新的一輪解碼
#于是,digit歸零
digit=0

#res重新初始化
res=""

#4、如果是"]"
elifch==']':

#此時,內層解碼已經有結果,需要把它和前面的字符串進行拼接

#第一步,先去查看內層解碼的字符串需要被重復輸出幾次
#比如e3[abc],比如內層解碼結果abc需要輸出3次
#通過數字棧提取出次數
count=numStack.pop()

#第二步,通過字符串棧提取出之前的解碼字符串
outString=strStack.pop()

#第三步,不斷的把內層解碼的字符串拼接起來
forjinrange(0,count):
#拼接到outString后面,拼接count次
outString+=res


#再把此時得到的結果賦值給res
res=outString

#返回解碼成功的字符串
returnres

四、復雜度分析

  • 時間復雜度 O(N),一次遍歷s
  • 空間復雜度 O(N),輔助棧在極端情況下需要線性空間。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 解碼
    +關注

    關注

    0

    文章

    189

    瀏覽量

    28714
  • 字符串
    +關注

    關注

    1

    文章

    596

    瀏覽量

    23165

原文標題:LeetCode 394:字符串解碼

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    求助 LabVIEW 字符串比較

    1.輸入一個字符串,儲存起來。 2.再次輸入一個字符串,先和儲存起來的字符串比較,如果不同則存儲起來,如果相同則不儲存。 3.再次輸入一個字符串,和所有儲存起來的
    發表于 03-02 17:24

    打開工程后工程中的字體沒有顯示,如字符串,數字等控件不能預覽顯示字體?

    打開工程后工程中的字體沒有顯示,如字符串,數字等控件不能預覽顯示字體?
    發表于 02-25 17:39

    字符串控件與靜態字符串控件中預覽字符顯示亂碼,如何修改顯示正常?

    字符串控件與靜態字符串控件中預覽字符顯示亂碼,如何修改顯示正常?
    發表于 01-20 17:17

    字符串,數字控件如何控制背景顏色和前景字體顏色?

    字符串,數字控件如何控制背景顏色和前景字體顏色?
    發表于 01-20 15:12

    Linux下怎么讓中文字符串按照拼音排序?

    求教 Linux 下怎么讓中文字符串按照拼音排序?
    發表于 01-06 07:40

    字符串關聯數字變量如何使用?我們的地址都是16位數據,可以使用16位數字變量顯示字符串嗎?

    字符串關聯數字變量如何使用?我們的地址都是16位數據,可以使用16位數字變量顯示字符串嗎?
    發表于 12-15 08:24

    如何使用 NuMaker 板和 Mbed OS 上的連接字符串連接到 Azure IoT?

    使用 NuMaker 板和 Mbed OS 上的連接字符串連接到 Azure IoT
    發表于 09-04 07:46

    LM3466 多 LED 電流平衡器技術手冊

    到電源的數或每個 LED 的正向電壓 字符串。 如果任何 LED 燈在運行過程中打開,LM3466 會自動平衡通過所有剩余活動 LED 燈的電源電流。 如 因此,即使一些 LED
    的頭像 發表于 08-29 14:27 ?1042次閱讀
    LM3466 多<b class='flag-5'>串</b> LED 電流平衡器技術手冊

    labview如何生成一個帶字符串返回的dll

    labview如何生成一個dll,如下圖,要求一個輸入,類型是字符串,返回類型也是字符串
    發表于 08-28 23:20

    在Python中字符串逆序有幾種方式,代碼是什么

    對于一個給定的字符串,逆序輸出,這個任務對于python來說是一種很簡單的操作,畢竟強大的列表和字符串處理的一些列函數足以應付這些問題 了,今天總結了一下python中對于字符串的逆序輸出的幾種常用
    的頭像 發表于 08-28 14:44 ?1082次閱讀

    SQL 通用數據類型

    如何與存儲的數據進行交互。 下面的表格列出了 SQL 中通用的數據類型: 數據類型 描述 CHARACTER(n) 字符/字符串。固定長度 n。 VARCHAR(n) 或 CHARACTER VARYING(n) 字符/
    的頭像 發表于 08-18 09:46 ?711次閱讀

    harmony-utils之StrUtil,字符串工具類

    harmony-utils之StrUtil,字符串工具類 harmony-utils 簡介與說明 [harmony-utils] 一款功能豐富且極易上手的HarmonyOS工具庫,借助眾多實用工具類
    的頭像 發表于 07-03 11:32 ?632次閱讀

    基于RK3576的BASE64編解碼

    參數、返回值及注意事項。最后,通過兩個示例代碼展示了如何對字符串進行BASE64編碼和解碼,并驗證了數據中包含0x00時的處理方式。
    的頭像 發表于 05-12 13:41 ?689次閱讀
    基于RK3576的BASE64編<b class='flag-5'>解碼</b>

    如何鎖定和解鎖S32K394/96系列的JTAG?

    如何鎖定和解鎖 S32K394/96 系列的 JTAG 端口 我們需要配置 DCF 和 UTEST 閃存嗎? 如果是,請分享配置和 UTEST 內存詳細信息以鎖定和解鎖。 如果沒有,請分享如何鎖定和解鎖 JTAG 端口的信息? 也請分享程序文件
    發表于 03-26 06:23

    STM32C031C6使用的是UART2通訊,通過printf()函數發送字符串時,漢字錯碼怎么解決?

    使用的是UART2通訊,通過printf()函數發送字符串時,漢字錯碼(見下圖),應該是KEIL哪里沒有設置好的問題。 啟用了UART2的中斷接收,可以接收到串口調試助手的數據,但是緩存區的指針沒有歸零,下次接收時緩存區中的內容接續(如下圖所示),不知道用什么命令來清除緩存區(即讓指針歸零)。
    發表于 03-07 12:30