用JavaScript刷leetcode第1249题-移除无效的括号

433 阅读1分钟

一、前言

虽然这题比较简单,但是我第一次提交没通过,没通过的原因是,Array.proptotype.splice方法会改变原数组的length,在此记录下自己犯得错误,下次谨记。

二、题目描述

原谅我比较懒,我直接从leetcode截图,来看咱们的题目描述了哈,欲知更加清楚的描述,请看leetcode题目链接

image.png

三、分析

  • 找出无效括号删除
  • 如何找?
  • 遇见左括号,压入delLeft
  • 遇见右括号,左括号栈的size大于0,出栈
  • 遇见右括号,左括号栈的size等于0,压入delRight栈
  • 然后合并这两个栈,即是所有无效括号的下标记录
  • 知道无效位置,只需遍历删除即可

四、代码

git代码链接

/**
 * @param {string} s
 * @return {string}
 */
const minRemoveToMakeValid = function(s) {
  // 保存该删除的左括号下标
  const delLeft = []
  // 保存该删除的右括号下标
  const delRight = []
  // 转字符串为数组
  const sArr = s.split('')
  // 遍历字符数组
  for(let i = 0; i < sArr.length; i++) {
    if(sArr[i] === '(') {
      // 遇见左括号,压入delLeft
      delLeft.push(i)
    }
    if(sArr[i] === ')') {
      if(delLeft.length) {
        // 遇见右括号,左括号栈的size大于0,出栈
        delLeft.pop()
      } else {
        // 遇见右括号,左括号栈的size等于0,压入right栈
        delRight.push(i)
      }
    }
  }
  // 遍历完后,合并该删除的左右括号
  const del = [...delLeft, ...delRight]
  // 遍历删除
  for(let i = 0; i < del.length; i++) {
    // sArr.splice(del[i], 1) ------ 错误代码,splice改变了原数组的长度,如果非要用,应该把del排个升序,然后从右往左遍历删
    sArr[del[i]] = ''
  }

  // 数组拼接
  return sArr.join('')

};