Java
import java.util.Stack;
/**
Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', and in any positions ) so that the resulting parentheses string is valid.
Formally, a parentheses string is valid if and only if:
It is the empty string, or
It can be written as AB (A concatenated with B), where A and B are valid strings, or
It can be written as (A), where A is a valid string.
Given a parentheses string, return the minimum number of parentheses we must add to make the resulting string valid.
Example 1:
Input: "())"
Output: 1
Example 2:
Input: "((("
Output: 3
Example 3:
Input: "()"
Output: 0
Example 4:
Input: "()))(("
Output: 4
Note:
S.length <= 1000
S only consists of '(' and ')' characters.
*/
public class Minimum_Add_to_Make_Parentheses_Valid {
class Solution {
public int minAddToMakeValid(String S) {
int ans = 0, bal = 0;
for (int i = 0; i < S.length(); ++i) {
bal += S.charAt(i) == '(' ? 1 : -1;
// It is guaranteed bal >= -1
if (bal == -1) {
ans++;
bal++;
}
}
return ans + bal;
}
}
class Solution2 {
// I'm thinking using stack
public int minAddToMakeValid(String S) {
Stack<Character> sk = new Stack<>();
int count = 0;
for (char each: S.toCharArray()) {
if (each == '(') {
sk.push(each);
} else if (each == ')') {
if (sk.isEmpty()) {
// key is this case
sk.push(each);
}
else if (sk.peek() == '(') {
sk.pop();
} else {
count += 1;
}
}
}
return count + sk.size();
}
}
}
Java
class Solution {
public int minAddToMakeValid(String S) {
int addCount = 0;
int curCount = 0;
int length = S.length();
for (int i = 0; i < length; i++) {
char c = S.charAt(i);
if (c == '(')
curCount++;
else {
if (curCount > 0)
curCount--;
else
addCount++;
}
}
addCount += curCount;
return addCount;
}
}