题目链接:LeetCode 1541. 平衡括号字符串的最少插入次数
题意:
给你一个括号字符串 s ,它只包含字符 '(' 和 ')' 。一个括号字符串被称为平衡的当它满足:
任何左括号 '(' 必须对应两个连续的右括号 '))' 。
左括号 '(' 必须在对应的连续两个右括号 '))' 之前。
比方说 "())", "())(())))" 和 "(())())))" 都是平衡的, ")()", "()))" 和 "(()))" 都是不平衡的。
你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
解题思路:
注意:有个坑,()())) 这种情况下,是需要 插入 3个的,而不是 0 个,不能先消掉之后再将后面的)往前移。
其他都没什么,直接上代码
代码:
class Solution {
/**
* @param String $s
* @return Integer
*/
function minInsertions($s) {
$len = strlen($s);
$a = array();
$left = 0;
$right = 0;
$ans = 0;
$k = true;
for($i = 0; $i < $len; $i++){
if($s[$i] == '('){
$left++;
} else {
if($i + 1 < $len && $s[$i+1] == ')'){
$i++; // 这种情况不用添加右括号
} else {
$ans++; // 缺少第二个右括号
}
if($left > 0){
$left--; // 消去就行,不用添加左括号
} else {
$ans++; // 缺少左括号
}
}
}
$ans += $left * 2; // 多的左括号需要2个右括号来匹配
return $ans;
}
}