栈、正则小试牛刀

93 阅读1分钟

把字符串"3[2[ac]3[4[a]1[b]]]"变成 acacaaaabaaaabaaaabacacaaaabaaaabaaaabacacaaaabaaaabaaaab 形式。例如 2[ac],变成 acac,且不用考虑2[3ab],3[a2[ab]]等特殊情况。

解法 1

  let string = '3[2[ac]3[4[a]1[b]]]';
  let numArr = [];
  let leftArr = [];
  let j = 0;

  function change(item, i) {
      if (item === '[') {
          //左中括号下标入栈
          leftArr.push(Number(i))
          //复制次数入栈
           numArr.push(Number(string.slice(0, i).match(/\d{1,}/g).pop()))
      } else if (item === ']') {
          //左中括号下标出栈
          let leftPop = leftArr.pop();
          //复制次数出栈
          let numPop = numArr.pop()
          let lsString = `${numPop}[${string.slice(leftPop + 1, i)}]`;
          string = string.replace(lsString, string.slice(leftPop + 1, i).repeat(numPop));
          //字符串长度可能发生变化
          length = string.length;
          //根据长度变化,修改循环的下标值
          j = j - lsString.length + numPop;
      }

  }
    for (j = 0; j < string.length; j++) {
        change(string[j], j)
    }

解法 2

此方法支持复制个数大于10的情况

  let string = '3[2[ac]3[4[a]1[b]]]';
  let reg = /([1-9]{1,})\[([a-z]+)\]/;

  function change() {
      let result = reg.exec(string);
      string = string.replace(result[0], result[2].repeat(result[1]))
  }
  //直到替换干净为止
  while (string.indexOf('[') > -1) {
      change(string)
  }