有效括号字符串为空 ("")、"(" + 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:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 “(()())(())”,原语化分解得到 “(()())” + “(())”,
删除每个部分中的最外层括号后得到 “()()” + “()” = “()()()”。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————
解题思路:题目意思是将一个有效字符串分割成若干有效字符串,并将每个子有效字符串的最外层括号删除,使用栈的思想,统计左括号和右括号的个数进行判断。
其Python代码如下:
class Solution:
def __init__(self):
self.ans = []
def removeOuterParentheses(self, S: str) -> str:
length = len(S)
index = 0 # 用于记录当前子有效字符串的起始位置
nums = 0 # 用于记录当前子有效字符串的左括号数量
for n in range(length):
# 当前符号为左括号
if S[n] == "(":
nums += 1
# 当前括号为右括号,同时多余的左括号只有一个
elif nums== 1:
# 此有效字符串的长度为2,则直接抛弃
if n-index+1==2:
index = n+1 # 更新起始位置
nums = 0 # 更新左括号的数量
continue
# 此有效字符串的长度大于2
else:
# 将此有效字符串放进列表中保存
self.ans.append(S[index+1:n])
index = n+1 # 更新起始位置
nums = 0 # 更新左括号数量
continue
# 当前括号为右括号,多余的左括号大于一个
else:
nums -= 1
return "".join(self.ans) # 将列表中的字符串进行合并并返回,使用join比+更快
其C++代码如下:
class Solution {
public:
string removeOuterParentheses(string S)
{
string ans = "";
int length = S.size();
int index = 0;
int nums = 0;
for(int i=0;i<length;++i)
{
if(S[i]=='(')
{
nums += 1;
}
else if(nums==1)
{
ans += S.substr(index+1,i-index-1);
index = i+1;
nums = 0;
}
else
{
nums -= 1;
}
}
return ans;
}
};
代码的实际复杂度为O(n),n为字符串的长度;空间复杂度为O(n);