[路飞]_字符串解码

202 阅读1分钟

394. 字符串解码

题目

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

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

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

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

示例1

输入: s = "3[a]2[bc]"
输出: "aaabcbc"

示例2

输入: s = "3[a2[c]]"
输出: "accaccacc"

题解

对[]中括号是一个组合,将中括号内部的字符串拆出来与中括号外面的数字结合;很显然可以用栈这个数据结构来解决这类问题

  • 将数据放在栈中
  • 按照什么规律放置呢?
  • 中括号
  • 题目中说中括号内肯定是字符串
  • 所以枚举字符串
  • 遇到数字存到num中,遇到字符串存到result中
  • 遇到[,将存储的数组、字符串放入栈中
  • 遇到 ],将存储在栈中的字符串拿出来处理,处理过程详见下图
  • 得到答案

代码

const decodeString = (s) => {
  const stack = []
  const string = []
  let num = ''
  let result = ''
  for (let i = 0; i < s.length; i++) {
    const k = s[i]
    if (!isNaN(k)) {
      num += k
    } else if (k === '[') {
      stack.push(num)
      string.push(result)
      num = ''
      result = ''
    } else if (k === ']') {
      const currentNum = stack.pop()
      result = string.pop() + result.repeat(Number(currentNum))
    } else {
      result += k
    }
  }
  return result
}

正则

正则,一个强大的字符串匹配;正则匹配数字后面为中括号+从a-Z的字符串;然后对匹配到的字符串合并;可以得到答案。

正则代码

var decodeString = function (s) {
	let reg = /(\d+)\[([a-zA-Z]+)\]/g;
    while(s.indexOf('[')>0){
        s = s.replace(reg,(_,...[num,str])=>{
            let result = "";
            for(let i=0;i<num-0;i++){
                result += str;
            }
            return result;
        });
    }
    return s;

};