题目描述
给你一个由 '('、')' 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以下 任意一条 要求:
空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作(A)的字符串,其中A是一个有效的「括号字符串」
示例
示例1:
输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
示例2:
输入: s = "a)b(c)d"
输出: "ab(c)d"
示例3:
输入: s = "))(("
输出: ""
解释: 空字符串也是有效的
示例4:
输入: s = "(a(b(c)d)"
输出: "a(b(c)d)"
提示:
1 <= s.length <= 10^5s[i]可能是'('、')'或英文小写字母
JavaScript实现
/**
* @param {string} s
* @return {string}
*/
var minRemoveToMakeValid = function(s) {
// 解决方法1,通过正序逆序遍历去掉不合法的括号
// let arr = [],count = 0;
// // 遍历去除多余的’)‘
// for(let i = 0; i < s.length; i ++){
// if(s[i] == '(' || s[i] != ')'){
// count += s[i] == '(';
// arr.push(s[i])
// }else {
// // 如果count==0,代表括号不合法,也就是说’)‘多,多出的不被push(实现剔除多余右括号)
// if(count) {
// count -= 1;
// arr.push(')')
// }
// }
// }
// //console.log('count',count);// 这时,如果count 不为0那么就代表有多余的’(‘
// if(count == 0) return arr.join('');
// // 第二次遍历去除多余 ’(‘, -逆序遍历
// let ret = []
// for(let i = arr.length - 1, count=0; i >= 0; i --){
// if(arr[i] == ')' || arr[i] != '('){
// count += arr[i] == ')';
// ret.unshift(arr[i])
// }else {
// if(count) {
// count -= 1;
// ret.unshift('(')
// }
// }
// }
// return ret.join('');
// 解决方法2 通过栈的思路
// 定义ret 模拟栈操作
// 遇到( 进栈 ;
// 遇到 )出栈; (入栈的是给的s序列的每个下标值,方便最后剔除左括号)
let stack=[];//模拟栈
let arr = s.split(''); //转成数组方便操作
for(let i = 0; i < arr.length; i ++) {
if(arr[i] == '(') {
// 遇到( 进栈
stack.push(i);
}else if(arr[i] == ')') {
// 遇到 )出栈;(前提栈不为空)
if( stack.length ) {
// 出栈
stack.pop()
}else {
//剔除原序列多余括号
arr[i] = ''
}
}
}
if(stack.length) { // 有多余的左括号,挨个剔除
for (let i=0; i < stack.length; i ++) {
arr[stack[i]] = ''
}
}
return arr.join('')
};