一、前言
虽然这题比较简单,但是我第一次提交没通过,没通过的原因是,Array.proptotype.splice方法会改变原数组的length,在此记录下自己犯得错误,下次谨记。
二、题目描述
原谅我比较懒,我直接从leetcode截图,来看咱们的题目描述了哈,欲知更加清楚的描述,请看leetcode题目链接
三、分析
- 找出无效括号删除
- 如何找?
- 遇见左括号,压入delLeft
- 遇见右括号,左括号栈的size大于0,出栈
- 遇见右括号,左括号栈的size等于0,压入delRight栈
- 然后合并这两个栈,即是所有无效括号的下标记录
- 知道无效位置,只需遍历删除即可
四、代码
/**
* @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('')
};