题目地址:
https://leetcode.com/problems/minimum-insertions-to-balance-a-parentheses-string/
给定一个长
n
n
n的括号字符串
s
s
s,定义其为“平衡”当且仅当每个'('
都可以找到其右的某个'))'
配对(即把正常的括号平衡的定义中右括号的配对个数改为
2
2
2)。问至少添加多少个括号就可以使其平衡。
可以使用栈。栈内只存未被匹配好的左括号。当遇到左括号的时候直接入栈;当遇到右括号的时候,首先看一下其后是否紧跟着另一个右括号,如果是,则看一下栈空不空,由于我们让栈里只存左括号,所以如果栈空的话,那么说明有个左括号可以与后面的两个右括号匹配,则pop栈顶;如果栈空,则说明需要补 1 1 1个左括号;如果其后没有紧跟着另一个右括号(或者后面没括号了,或者后面跟着的是左括号),那么也看一下栈是否空,如果栈空,则说明该右括号需要一个左括号一个右括号来保持平衡,所以答案加 2 2 2,如果栈不空,则只需要一个右括号去平衡即可,答案加 1 1 1同时pop栈顶。最后遍历完之后,栈内存的全是左括号,它们需要两倍栈size的右括号去平衡,将两倍栈size加入答案。代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution {
public int minInsertions(String s) {
Deque<Character> stk = new ArrayDeque<>();
int res = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
stk.push(ch);
} else {
if (i < s.length() - 1 && s.charAt(i + 1) == ')') {
if (stk.isEmpty()) {
res++;
} else {
stk.pop();
}
i++;
} else {
if (stk.isEmpty()) {
res += 2;
} else {
stk.pop();
res++;
}
}
}
}
return res + stk.size() * 2;
}
}
时空复杂度 O ( n ) O(n) O(n)。