持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目描述
这是 力扣上的 921. 使括号有效的最少添加,难度为 中等。
题目分析
题目描述和题目示例我们知道这又是一个处理括号的题目,一般咱们处理括号类型的题目都会习惯性的使用栈的方式,例如补充缺失的括号等等
一开始看到这个题,我的第一想法也是使用栈,因为栈的先入后出的特性,这就保证了咱们的括号的有序和成对
但是仔细看题目给出的示例,题目只要要求我们使用最少添加括号的方式,来实现本题的要求,那么其实我们只需要检查有多少左括号有右括号就可以知道答案了,但是这里我们需要注意的是,就现成给出的字符串中,左括号一定要在右括号之前,才可以成对,否则就是不能成对的
此处咱们就可以有这样的思路
-
遍历题目给出的字符串,如果是左括号,就记录下来左括号的数量 leftCnt,如果是右括号的话,咱们就看看 leftCnt 是否大于 0
- 若是,则说明可以成对,则 leftCnt-1
- 若不是,则说明,此时的右括号没有现成的匹配的左括号,那么就需要我们主动加上一个左括号, 那么就结果 res +1
-
遍历完毕之后,咱们就可以检查 结果 res 与 leftCnt 的和,即时本题需要咱们添加最少的括号个数,此处并没有要求我们记录是需要添加左括号还是由括号
- 如果需要的话,咱们的本次做法也是可以的, leftCnt 表示需要添加的右括号个数,res 表示需要添加左括号的个数
实现方式,同样咱们还是分为 golang 和 C 语言的方式,本次 golang 和 C 的实现没有什么不同:
Golang 的实现方式:
func minAddToMakeValid(s string) (res int) {
leftCnt := 0
for _, c := range s {
if c == '(' {
leftCnt++
} else if leftCnt > 0 {
leftCnt--
} else {
res++
}
}
return res + leftCnt
}
C 的实现方式:
int minAddToMakeValid(char * s){
int res = 0;
int leftCnt = 0;
int length = strlen(s);
for (int i = 0; i < length; i++) {
char c = s[i];
if (c == '(') {
leftCnt++;
} else if(leftCnt > 0) {
leftCnt--;
}else {
res++;
}
}
res += leftCnt;
return res;
}
这种实现方式,时间复杂度是 O(n),n 就是遍历 s 字符串中字符的个数,空间复杂度是 O(1)
今天就到这里,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~