[LeetCode] 1249. Minimum Remove to Make Valid Parentheses
Posted aaronliu1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1249. Minimum Remove to Make Valid Parentheses相关的知识,希望对你有一定的参考价值。
移除无效的括号。题意是给一个带有左括号和右括号的字符串,请你移除一些括号,使得剩下的部分成为一个有效的字符串。例子,
Example 1:
Input: s = "lee(t(c)o)de)" Output: "lee(t(c)o)de" Explanation: "lee(t(co)de)" , "lee(t(c)ode)" would also be accepted.Example 2:
Input: s = "a)b(c)d" Output: "ab(c)d"Example 3:
Input: s = "))((" Output: "" Explanation: An empty string is also valid.Example 4:
Input: s = "(a(b(c)d)" Output: "a(b(c)d)"
思路是stack但是这个题跟20题valid parenthesis还不太一样,因为不光是判断,而是最后需要返回一个有效的结果。这个题我没有用到stack但是用到了stack的思想,用一个open变量判断到底是左括号多还是右括号多,如果open小于0(右括号多)就一定不要再放右括号了。第一次扫描input,从左往右;第二次从右往左,但是因为第一次扫描的时候只是控制不能让右括号多于左括号,所以在第二次从右往左扫描的时候需要判断如果左括号多了,就不要再加入结果集了。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public String minRemoveToMakeValid(String s) { 3 StringBuilder sb = new StringBuilder(); 4 int open = 0; 5 for (char c : s.toCharArray()) { 6 if (c == ‘(‘) { 7 open++; 8 } else if (c == ‘)‘) { 9 if (open == 0) { 10 continue; 11 } 12 open--; 13 } 14 sb.append(c); 15 } 16 17 StringBuilder res = new StringBuilder(); 18 for (int i = sb.length() - 1; i >= 0; i--) { 19 if (sb.charAt(i) == ‘(‘ && open-- > 0) { 20 continue; 21 } 22 res.append(sb.charAt(i)); 23 } 24 return res.reverse().toString(); 25 } 26 }
以上是关于[LeetCode] 1249. Minimum Remove to Make Valid Parentheses的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 1249. Minimum Remove to Make Valid Parentheses
1249. Minimum Remove to Make Valid Parentheses