「栈」leetcode 394.字符串编码(中等)

729 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、了解题目

附上原题链接:394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string] ,表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

二、题解分析

这道题会用到数据结构中的来解答。那么接下来我们来看下这道题的解题步骤,具体如下:

  • 定义两个栈,一个用来存放倍数,一个用来存放待拼接的字符串。
  • 定义一个数值的 num 变量,来存放倍数以及对倍数进行拼接操作。
  • 定义一个字符串的 result 变量,用来拼接字符串。
  • 逐字符扫描,将会遇到 4 种情况:遇到数字;遇到 [遇到 ]遇到字母。

三、代码实现

依据上面的题解,我们将用 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

以上就是关于字符串编码的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋