题意:
给一串括号组成的序列,问最少需要添加多少个才使得括号合法。
从形式上讲,只有满足下面几点之一,括号字符串才是合法的:
- 它是一个空字符串,或者
- 它可以被写成
AB
(A
与B
连接), 其中A
和B
都是有效字符串,或者 - 它可以被写作
(A)
,其中A
是有效字符串
思路:
一开始蒙着眼睛写DP,结果超时了。。。。。原来是个机智题。如果前面有"(",那么后面来“)”就能保证是合法的。所以我们只需要统计最前面多的")"和最后面多的“(”。即第一个'('之后的‘(’应该要和')'相同数量,如果这个后面的括号和反括号的数量不匹配的话,需要额外添加括号与之匹配这是第一个需要补括号的地方,同时,第一个'('之前的‘)’需要额外添加括号成对,这是第二个需要补括号的地方。这两个地方需要补括号的数量之和就是答案。
代码:
class Solution {
public:
int minAddToMakeValid(string S) {
int len = S.length();
int first = 0,last = 0; //first记录反括号数量,last记录括号数量
for(int i=0;i<len;i++){
if(S[i]=='(')last++;
else {
if(last==0)first++;
else last--;
}
}
return first+last;
}
};