Given a string with parentheses, return a string with balanced parentheses by removing the fewest characters possible. You cannot add anything to the string. Examples: balance("()") -> "()" balance("(((((") -> "" balance("(()()(") -> "()()" balance(")(())(") -> "(())"
public String balance(String s) { int n = s.length(); int start = n, end = 0; Stack<Integer> stack = new Stack<>(); for(int i=0; i<n; i++) { int c = s.charAt(i); if(stack.isEmpty() || c == '(') { stack.push(i); } else { int top = stack.peek(); if(s.charAt(top) == ')') { stack.push(i); } else { stack.pop(); start = Math.min(start, top); end = Math.max(end, i); } } } return start>=end ? "" : s.substring(start, end+1); }
可惜以上代码是不对的,不能解决“()(()”的情况,此时应该输出“()()”。
“(()()((()()))”时应该输出“()()((()()))”或者“(())((()()))”。
修改代码如下:
public String balance(String s) { Stack<Integer> stack = new Stack<>(); StringBuilder sb = new StringBuilder(s); for(int i=0; i<s.length(); i++) { int c = s.charAt(i); if(stack.isEmpty() || c == '(') { stack.push(i); } else { int top = stack.peek(); if(s.charAt(top) == ')') { stack.push(i); } else { stack.pop(); } } } while(!stack.isEmpty()) { sb.deleteCharAt(stack.pop()); } return sb.toString(); }