力扣刷题之路-----括号匹配问题
括号匹配问题在力扣中有好几道,简单的括号匹配问题即一个左括号需要对应一个右括号,判断是否匹配或者需要加入几个左括号或右括号,此时的问题比较简单,当字符串中的字符只有一种类型的括号时,直接用一个变量存储需要的左括号或者右括号数量即可,当有多种括号类型时,可以利用栈保存字符串数组中的字符,根据栈后进先出的特点,检查括号是否匹配。
921. 使括号有效的最少添加
这个问题的解决比较简单,因为只有一种类型的括号,且一个左括号必须对应一个右括号。使用left变量记录左括号的需求量,使用right变量记录右括号的需求量。当是左括号的时候,right+1;当是右括号的时候,right-1,且当right为-1的时候,表示此时右括号的数量已经比左括号多了,此时left需要+1,且right变为0。
public int minAddToMakeValid(String s) { int left = 0; int right = 0; for(char ch:s.toCharArray()){ if(ch=='(') right++; else { right--; if(need==-1) { left++; right=0; } } } return (left+right); }
1541. 平衡括号字符串的最少插入次数
这个题和上一道题目的思想差不多,但是这道题是一个左括号对应两个右括号。仍然使用两个变量left和right分别记录左右括号所需量。遇到右括号的情况和上边一样,当right=-1时说明右括号太多了,需要一个左括号,且因为一个左括号对应两个右括号,此时右括号的需求变成1。当是左括号的时候,如果右括号的需求是奇数,则表示前面差一个右括号,此时用temp来记录此左括号之前差一个右括号,且右括号的总需求-1。(直接用left变量来存储也是可以的,因为left变量只进行了加法,其他时候并没有进行修改)
public int minInsertions(String s) { int left=0,right=0,temp=0; for(char ch: s.toCharArray()){ if(ch=='(') { right += 2; if(right%2!=0){ temp+=1; right-=1; } } else { right--; if(right==-1){ //此时说明右括号太多了 left++; right=1; } } } return left+right+temp; }