【lintcode算法题目详解】2506 · 删除不匹配的括号 变种题目: 1721 · 使括号有效的最少添加

2506 · 删除不匹配的括号

原题

题目描述:

你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。

例如:"()", “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。

解法:

这个问题可以利用堆栈的思想:

  • 开始检测
    • 遇到 ( 即执行压栈的操作
    • 遇到 ) 先检查栈顶的元素是否是 (
      • 是的话就将栈顶元素给去除
      • 不是 就是栈里为空
  • 整体结束后 检查栈是否为空,若不为空 就将 栈里的元素下标压入要去除的下标中

python版本解法:

class Solution:
    """
    @param s: A string with lowercase letters and parentheses
    @return: A string which has been removed invalid parentheses
    """
    def removeParentheses(self, s: str) -> str:
        # write your code here.
        str1 = ''   #对应的括号
        list1 = []   #记录的下标
        rem = []   #要删除的内容
        length = len(s)
        for i in range(length):
            if s[i] == '(':
                str1+=s[i]
                list1.append(i)
            elif s[i] == ')':
                if len(str1) == 0 or str1[-1] !='(':
                    rem.append(i)
                else:
                    str1 = str1[:-1]
                    list1.pop()
        if str1 != '':
            for i in list1:
                rem.append(i)
        result = ''
        for i in range(length):
            if i not in rem:
                result += s[i]
        return result

java解决办法:

呃,这个 不好意思,暂时没写出来,之前被调bug给搞傻,后面有时间再来补

1721 · 使括号有效的最少添加

题目变种:

1721 · 使括号有效的最少添加

描述
给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。

从形式上讲,只有满足下面几点之一,括号字符串才是有效的:

它是一个空字符串,或者
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。

java解法:

public class Solution {
    /**
     * @param S: the given string
     * @return: the minimum number of parentheses we must add
     */
    public int minAddToMakeValid(String S) {
        // Write your code here
        String str1 = "";
        int count = 0;

        for(int i =0 ;i<S.length();i++){
            if(S.charAt(i) == '('){
                str1 += '(';
            }
            else if(S.charAt(i) == ')'){
                if(str1.length()!=0){  //栈中只会存在前括号  不为0时  必定匹配
                    str1 = str1.substring(0,str1.length()-1);
                }
                else{  //栈中为空 //有后括号  无前括号  需要加个1
                    count++;
                }
            }
        }
        if(!str1.equals("")){  //不为空  栈中有剩余的 ( 左括号存在
            count +=str1.length();
        }
        return count;
    }
}

java精选解法:

public class Solution {
    /**
     * @param S: the given string
     * @return: the minimum number of parentheses we must add
     */
    public int minAddToMakeValid(String S) {
        // Write your code here
         // Write your code here
        int left = 0, right = 0;
        for (char i : S.toCharArray()) {
            
            if (right == 0 && i == ')') {
                // 当前需要增加的右括号数量为0且出现了右括号时,需要增加的左括号数量+1
                left++;
            } else {
                // 否则如果当前遇到的是左括号,那么需要增加的右括号数量+1,如果遇到的是右括号则-1
                right += i == '(' ? 1 : -1;
            }
        }
        return left + right;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿,葱来了-C is coming

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值