classSolution: defremoveOuterParentheses(self, s: str) -> str: res, stack = "", [] for c in s: if c == ')': stack.pop() if stack: res += c if c == '(': stack.append(c) return res
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: string removeOuterParentheses(string s){ string res; stack<char> st; for (auto c : s) { if (c == ')') { st.pop(); } if (!st.empty()) { res.push_back(c); } if (c == '(') { st.emplace(c); } } return res; } };
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public String removeOuterParentheses(String s) { StringBufferres=newStringBuffer(); Deque<Character> stack = newArrayDeque<Character>(); for (inti=0; i < s.length(); i++) { charc= s.charAt(i); if (c == ')') { stack.pop(); } if (!stack.isEmpty()) { res.append(c); } if (c == '(') { stack.push(c); } } return res.toString(); } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
publicclassSolution { publicstringRemoveOuterParentheses(string s) { StringBuilder res = new StringBuilder(); Stack<char> stack = new Stack<char>(); foreach (char c in s) { if (c == ')') { stack.Pop(); } if (stack.Count > 0) { res.Append(c); } if (c == '(') { stack.Push(c); } } return res.ToString(); } }
char * removeOuterParentheses(char * s) { int len = strlen(s); char *res = (char *)malloc(sizeof(char) * len); char *stack = (char *)malloc(sizeof(char) * (len / 2)); int pos = 0, top = 0; for (int i = 0; i < len; i++) { char c = s[i]; if (c == ')') { top--; } if (top > 0) { res[pos++] = c; } if (c == '(') { stack[top++] = c; } } free(stack); res[pos] = '\0'; return res; }
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funcremoveOuterParentheses(s string)string { var ans, st []rune for _, c := range s { if c == ')' { st = st[:len(st)-1] } iflen(st) > 0 { ans = append(ans, c) } if c == '(' { st = append(st, c) } } returnstring(ans) }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var removeOuterParentheses = function(s) { let res = ''; const stack = []; for (let i = 0; i < s.length; i++) { const c = s[i]; if (c === ')') { stack.pop(); } if (stack.length) { res += c; } if (c === '(') { stack.push(c); } } return res; };
复杂度分析
时间复杂度:O(n),其中 n 是输入 s 的长度。仅需遍历 s 一次。
空间复杂度:O(n),其中 n 是输入 s 的长度。需要使用栈,长度最大为 O(n)。
方法二:计数
思路
从 s 开始位置计算子数组的和,遇到 (’ 则加 1,遇到 )’ 则减 1,第一次和为 0 时则为第一个原语。从上一个原语的结束位置的下一个位置开始继续求子数组的和,和首次为 0 时则是另一个新的原语,直到遇到 s 的结尾。保存结果时,忽略每个原语的开始字符和结尾字符,其他字符均保存下来生成新的字符串。代码对流程进行了部分优化,减少了判断语句。
代码
[sol2-Python3]
1 2 3 4 5 6 7 8 9 10 11
classSolution: defremoveOuterParentheses(self, s: str) -> str: res, level = "", 0 for c in s: if c == ')': level -= 1 if level: res += c if c == '(': level += 1 return res
[sol2-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: string removeOuterParentheses(string s){ int level = 0; string res; for (auto c : s) { if (c == ')') { level--; } if (level) { res.push_back(c); } if (c == '(') { level++; } } return res; } };
[sol2-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public String removeOuterParentheses(String s) { intlevel=0; StringBufferres=newStringBuffer(); for (inti=0; i < s.length(); i++) { charc= s.charAt(i); if (c == ')') { level--; } if (level > 0) { res.append(c); } if (c == '(') { level++; } } return res.toString(); } }
[sol2-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
publicclassSolution { publicstringRemoveOuterParentheses(string s) { int level = 0; StringBuilder res = new StringBuilder(); foreach (char c in s) { if (c == ')') { level--; } if (level > 0) { res.Append(c); } if (c == '(') { level++; } } return res.ToString(); } }
char * removeOuterParentheses(char * s) { int len = strlen(s); int level = 0; char *res = (char *)malloc(sizeof(char) * (len + 1)); int pos = 0; for (int i = 0; i < len; i++) { char c = s[i]; if (c == ')') { level++; } if (level) { res[pos++] = c; } if (c == '(') { level--; } } res[pos] = '\0'; return res; }
[sol2-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
funcremoveOuterParentheses(s string)string { ans := []rune{} level := 0 for _, c := range s { if c == ')' { level-- } if level > 0 { ans = append(ans, c) } if c == '(' { level++ } } returnstring(ans) }
[sol2-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var removeOuterParentheses = function(s) { let level = 0; let res = ''; for (let i = 0; i < s.length; i++) { const c = s[i]; if (c === ')') { level--; } if (level > 0) { res += c; } if (c === '(') { level++; } } return res; };
复杂度分析
时间复杂度:O(n),其中 n 是输入 s 的长度。仅需遍历 s 一次。
空间复杂度:O(n),其中 n 是输入 s 的长度。需要用数组暂时保存结果,并转换为字符串。部分语言支持字符串的修改,可以做到 O(1) 空间复杂度。