「棧」leetcode 394.字符串編碼(中等)

1、瞭解題目

附上原題連接:394. 字符串解碼web

給定一個通過編碼的字符串,返回它解碼後的字符串。markdown

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

你能夠認爲輸入字符串老是有效的;輸入字符串中沒有額外的空格,且輸入的方括號老是符合格式要求的。app

此外,你能夠認爲原始數據不包含數字,全部的數字只表示重複的次數 k ,例如不會出現像 3a2[4] 的輸入。oop

2、題解分析

這道題會用到數據結構中的來解答。那麼接下來咱們來看下這道題的解題步驟,具體以下:ui

  • 定義兩個棧,一個用來存放倍數,一個用來存放待拼接的字符串。
  • 定義一個數值的 num 變量,來存放倍數以及對倍數進行拼接操做。
  • 定義一個字符串的 result 變量,用來拼接字符串。
  • 逐字符掃描,將會遇到 4 種狀況:遇到數字;遇到 [遇到 ]遇到字母。

3、代碼實現

依據上面的題解,咱們將用 js 來實現這道題。具體實現代碼以下:編碼

/** * @param {string} s * @return {string} */let decodeString = function(s) {
    // 1. 存倍數的棧
    let numStack = [];
    // 2. 存待拼接的str的棧     
    let strStack = [];
    // 3. 倍數的「搬運工」    
    let num = 0;
    // 4. 字符串的「搬運工」
    let result = '';
    // 5. 逐字符掃描
    for (let char of s) {
        // 5.1 遇到數字
        if (!isNaN(char)) {
            // 5.1.1 算出倍數
            num = num * 10 + Number(char); 
        } 
        // 5.2 遇到 [
        else if (char === '[') {
            // 5.2.1 將result已經拼接完成的放到strStack當中
            strStack.push(result);
            // 5.2.2 入棧後清零 
            result = '';
            // 5.2.3 倍數num進入棧等待
            numStack.push(num);
            // 5.2.4 入棧後清零
            num = 0;
            
        } 
        // 5.3 遇到 ],兩個棧的棧頂出棧
        else if (char === ']') {
            // 5.3.1 獲取拷貝次數
            let repeatTimes = numStack.pop();
            // 5.3.2 構建子串
            result = strStack.pop() + result.repeat(repeatTimes); 
        } 
        // 5.4 遇到字母,追加給result串
        else {
            result += char;
        }
    }
    // 6. 最終返回結果
    return result;
};
​
console.log(decodeString('3[a2[c]]')); // accaccacc
console.log(decodeString('3[a]')); // aaa
複製代碼

以上就是關於字符串編碼的題解,不知道對小夥伴們是否有幫助呢?spa

咱們下期見👋👋👋code

相關文章
相關標籤/搜索