题目 简单
有效括号字符串为空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
示例 1:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
示例 2:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
示例 3:
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
解题思路
用一个整形标记即可,左括号出现 +1,如果值大于 1 表示为内部左括号,拼接到返回字符串即可;如果右括号出现则 -1,如果此时的值大于 0 表示为内部右括号,拼接到返回字符串即可。 时间复杂度: O(N),N 为字符串的长度。
CODE
/**
* @param {string} S
* @return {string}
*/
var removeOuterParentheses = function (S) {
const sArray = S.split('');
var tag = 0;
var result = '';
for (index = 0; index < sArray.length; index++) {
if (sArray[index] === '(') {
tag ++;
if (tag > 1) {
result += sArray[index];
}
} else {
tag --;
if (tag > 0) {
result += sArray[index];
}
}
}
return result;
};
removeOuterParentheses("(()())(())")
这是在我看了leetCode上的解题思路然后写的,下面我记录下我拿到题目后的自己的思路和解法。
用一个标识符记录原语的开始索引,然后用一个数组记录内部左括号的索引,当匹配到右括号就删除数组中的一个左括号索引值(表示匹配了一对括号).当数组为空表示一个原语匹配完成,则记录到结果中。
注意:我这个思路耗时和耗费内存较高,不推荐,只是记录下我的思路😁
/**
* @param {string} S
* @return {string}
*/
var removeOuterParentheses = function (S) {
var sArray = S.split('');
var primitiveStart = -1;
var startList = [];
var result = '';
for (index = 0; index < sArray.length; index++) {
if (sArray[index] === '(') {
if (primitiveStart === -1) {
primitiveStart = index; //记录原语的开始index
} else {
startList.push(index);
}
} else {
let len = startList.length;
let lastIndex = startList[len - 1];
if (len <= 0) {
var result = sArray.slice(primitiveStart, index + 1);
result += result.slice(1, result.length - 1).join('');
primitiveStart = -1;
} else {
startList.splice(len -1);
}
}
}
return result;
};
网友评论