有效括号字符串为空 ( " " ) ("") ("")、 " ( " + A + " ) " "(" + A + ")" "("+A+")" 或 A + B A + B A+B,其中 A A A 和 B B B 都是有效的括号字符串, + + + 代表字符串的连接。例如, " " "" "", " ( ) " "()" "()", " ( ( ) ) ( ) " "(())()" "(())()" 和 " ( ( ) ( ( ) ) ) " "(()(()))" "(()(()))" 都是有效的括号字符串。
如果有效字符串 S S S 非空,且不存在将其拆分为 S = A + B S = A+B S=A+B 的方法,我们称其为原语 ( p r i m i t i v e ) (primitive) (primitive),其中 A A A 和 B B B 都是非空有效括号字符串。
给出一个非空有效字符串 S S S,考虑将其进行原语化分解,使得: S = P 1 + P 2 + . . . + P k S = P_1 + P_2 + ... + P_k S=P1+P2+...+Pk,其中 P i P_i Pi 是有效括号字符串原语。
对 S S S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S S S 。
示例 1:
输入: " ( ( ) ( ) ) ( ( ) ) " "(()())(())" "(()())(())"
输出: " ( ) ( ) ( ) " "()()()" "()()()"
解释:
输入字符串为 " ( ( ) ( ) ) ( ( ) ) " "(()())(())" "(()())(())",原语化分解得到 " ( ( ) ( ) ) " + " ( ( ) ) " "(()())" + "(())" "(()())"+"(())",
删除每个部分中的最外层括号后得到 " ( ) ( ) " + " ( ) " = " ( ) ( ) ( ) " "()()" + "()" = "()()()" "()()"+"()"="()()()"。
示例 2:
输入: " ( ( ) ( ) ) ( ( ) ) ( ( ) ( ( ) ) ) " "(()())(())(()(()))" "(()())(())(()(()))"
输出: " ( ) ( ) ( ) ( ) ( ( ) ) " "()()()()(())" "()()()()(())"
解释:
输入字符串为 " ( ( ) ( ) ) ( ( ) ) ( ( ) ( ( ) ) ) " "(()())(())(()(()))" "(()())(())(()(()))",原语化分解得到 " ( ( ) ( ) ) " + " ( ( ) ) " + " ( ( ) ( ( ) ) ) " "(()())" + "(())" + "(()(()))" "(()())"+"(())"+"(()(()))",
删除每隔部分中的最外层括号后得到 " ( ) ( ) " + " ( ) " + " ( ) ( ( ) ) " = " ( ) ( ) ( ) ( ) ( ( ) ) " "()()" + "()" + "()(())" = "()()()()(())" "()()"+"()"+"()(())"="()()()()(())"。
示例 3:
输入: " ( ) ( ) " "()()" "()()"
输出: " " "" ""
解释:
输入字符串为 " ( ) ( ) " "()()" "()()",原语化分解得到 " ( ) " + " ( ) " "()" + "()" "()"+"()",
删除每个部分中的最外层括号后得到 " " + " " = " " "" + "" = "" ""+""=""。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:这是一道标记为使用栈的题目。题目的意思可能不大好理解。大体上就是从字符串中找到一个子字符串,其左括号的数量等于右括号的数量,把最外层的左括号和右括号去掉。然后把符合这种情形的所有子字符串去掉最外层括号后加起来就可以得到题目要输出的字符串。
这里参考了大神的解题思路,当左括号的数量不等于右括号的数量时,直接把当前的括号压进字符串中,当左括号的数量等于右括号的数量时,抛弃当前的右括号和最开始的左括号。然后从下一个左括号重新开始检查。
class Solution {
public:
string removeOuterParentheses(string s) {
int length = s.size(); # 计算字符串的长度
int index = 1; # index的功能是存储左括号和右括号的数量之差。第一个字符肯定是左括号,跳过第一个字符,默认已有左括号存在,所以左括号的数量和右括号的数量之差为1。
string str; # 用于存储符合要求的子字符串
for(int i=1;i<length;i++) # 跳过第一个字符,因为必定是左括号,从第二个字符开始计算
{
if(s[i]==')') # 如果当前为右括号,则将index的值减1
index--;
else # 否则,index的值加1
index++;
if(index!=0) #如果当前左括号的数量和右括号的数量不相同,则当前索引的括号必定在符合要求的子字符串括号中,直接将其压进字符串中
{
str.push_back(s[i]);
continue; # 直接跳回循环
}
i++; # 如果index等于零,则重新开始,下一个必定是左括号,所以可以直接跳过下一个括号
index=1;
}
return str;
}
};