持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
给定一个括号字符串 s ,移动N次,你就可以在字符串的任何位置插入一个括号。 例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。 返回 为使结果字符串 s 有效而必须添加的最少括号数。
分析
一道中等难度的算法题。涉及到的知识点无外乎是字符串。但是本题更偏向于另外一种类型——有关符号的算法知识点。一看到题干中的大、小括号,熟悉力扣或者是刷过《剑指Offer》的小伙伴们肯定对于另一道题目有印象:有效的括号——类似的,今天的每日力扣,聚焦的也是有关于括号的算法。 对于有关括号的算法题,我们一般使用贪心算法:左括号一定会匹配一个右括号,而且右括号的左边一定是左括号。 因此本道题目,其实可以以左括号为基准,判断右括号的数量,对数量进行补充。具体的思路如下:
- 分别定义插入次数 count 和 右括号的需求量
int count =0;
int mark =0;
- 遍历字符串,如果是左括号则+1,相反的,如果是右括号则+1
for(int i =0;i<s.length();i++){
if(s.chartAt(i)='('){
mark++;
}
if(s.chartAt(i)=')'){
mark--;
}
}
- 如果当前的mark为-1,则意味着不匹配,需要增加一次插入
if(mark==-1) {
mark=0;
count++;
}
4.最后返回插入的次数和右括号的需求量之和即可。
总结
虽然这道题明面上是一道字符串算法题。但是如果刷过类似题目的同学,肯定一眼就分析出它属于一个特别小众的方向——括号判断。在对括号进行处理判定的时候,我们通常使用的都是贪心算法,因为括号匹配具有其特殊性:左括号必定对应着右括号。因此贪心算法可以很好的进行模拟。