思路
很经典的有效括号的一道题,常用栈来解决:
- 遇到
(
,则入栈; - 遇到
)
,若栈顶为(
,则弹出(
,判断下一个字符;若栈顶为)
,则当前)
入栈。
栈顶为
)
时,说明栈中元素均为)
。因为假设如果栈中有(
,则遇到下一个)
时就应该被弹出了。
最后返回栈中元素个数即可。
本题目中,可以不利用栈来实现,只需要使用两个数字left
和right
来进行模拟栈操作即可,两个数字分别代表(想象中的)栈中的(
和)
的个数:
- 遇到
(
,left++
,类似于入栈; - 遇到
)
,若left > 0
, 则left--
;若left == 0
,则right++
。
left > 0
说明(想象中的)栈栈顶元素为(
,弹出操作对应着left--
。
最后返回left + right
即可。
代码如下:
class Solution {
public int minAddToMakeValid(String s) {
int left = 0, right = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ')'){
if (left > 0){
left--;
} else {
right++;
}
} else {
left++;
}
}
return left + right;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)