#leetCode刷题纪实 Day2
https://leetcode-cn.com/problems/remove-outermost-parentheses/
有效括号字符串为空 ("")、"(" + 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:
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。
提示:
S.length <= 10000
S[i] 为 "(" 或 ")"
S 是一个有效括号字符串
小菜鸡尝试独立解题:
花了很大的劲儿才读懂原语和学会人脑求解,但对编程实现毫无思路,于是阅读了leetcode的提示“Can you find the primitive decomposition? The number of ( and ) characters must be equal.”,似乎突然觉得可以通过这样找到原语!然后思考要前后弹出一个半括号,思索了一下所知道的数据结构,决定采用deque(双端队列)。然后遇到的思路瓶颈是对于原语 ((())) 和 (()()),可以通过一次前后弹出操作,但无从得知操作后得到的是一个原语还是两个原语。也顺着得到了思路,那就把操作后的字符串再重复一遍最初的从前到后记数左右括号数量的操作,为了代码的简洁和可读性,可以写成一个函数。但最后兜兜转转把自己绕晕了。
小菜鸡尝试阅读大佬解题:
1 class Solution { 2 public: 3 string removeOuterParentheses(string S) { 4 int L=1;int R=0; 5 string ans; 6 for(int i=1;i<S.size();i++){ 7 if(S[i]=='(')L++; 8 else R++; 9 if(R!=L)ans.push_back(S[i]); 10 else { 11 i++;L=1;R=0; 12 } 13 } 14 return ans; 15 } 16 };
第一遍读代码的时候还是不知所以然,甚至觉得不能实现,直到自己手画了几个例子才理解了思路,思路真的很巧!
第一个左括号不入栈但记数,从第二个字符开始,如果左括号数量和右括号数量不相同,就入栈。如果左括号数量等于右括号数量,当前字符不入栈。同时左括号数量置1,右括号数量置0,且跳过下一个字符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

浙公网安备 33010602011771号