Leetcode:使括号有效的最少添加
上代码
方法一:使用Deque 双向队列
/**
* 方法一:使用Deque 双向队列
* @param s
* @return
*/
public int minAddToMakeValid(String s) {
//1、将括号字符串转换为char[] 字符数组
char[] data = s.toCharArray();
//2、使用Deque双端队列:Java中的Deque实现主要有两种:ArrayDeque和LinkedList
Deque<Character> result = new ArrayDeque<>();
//3、循环遍历字符数组,进行队列顶端元素和当前元素的比较:
// (1)如果队列顶端元素是'(' 并且当前遍历的元素为')'则将读队列顶端元素remove
// (2)否则,就将遍历到的元素入队列末尾
for (char x : data) {
if (result.size() != 0 && result.peekLast() == '(' && x == ')') {
result.removeLast();
} else {
result.addLast(x);
}
}
//4、最后,result队列中还剩多少个元素就是使括号有效的最少添加
return result.size();
}
方法二:找匹配规则,设定两个变量分别记录左、右括号的数量
/**
* 方法二:找规律匹配
*/
public int minAddToMakeValid(String s) {
//1、将字符串转换为字符数组
char[] data = s.toCharArray();
//2、设定两个变量,用于分别记录左右括号的个数
int letfCount = 0;
int rightCount = 0;
//3、遍历字符数组
//(1)if 如果是'(' 则leftCount++;
//(2)else if 即不是'(' 如果是')', 并且'('的数量大于0 则leftCount--;
//(3)else 即不是'('并且leftCount不大于0,则rightCount++
for (char x : data) {
if (x == '(') {
letfCount++;
} else if (x == ')' && letfCount > 0) {
letfCount--;
} else {
rightCount++;
}
}
return letfCount + rightCount;
}