13 -- 移除无效的括号

移除无效的括号

Github链接

  • 思路
  1. 遇到"("入栈
  2. 遇到")“,看栈是否为空,栈为空,则删除当前元素
    栈不为空,则拿出栈顶元素进行比较
    如果栈顶元素能凑成一对”()",则移除栈顶元素
  3. 遍历完成后,再看栈中的元素
  4. 存储栈的时候,用字典来存储,这样可以记录索引
  5. 删除的时候,从后往前删除,不要破坏索引的结构
class facebook_01 {
    //s = "lee(t(c)o)de)" // "a)b(c)d" //"(a(b(c)d)" //"())()(((" "()"
    //"())()((("
    func minRemoveToMakeValid(_ s: String) -> String {
        var arr = Array(s).map{String($0)}
        var stack = [[Int: String]]()
        
        var left = 0
        while left < arr.count {
            if stack.isEmpty {
                if arr[left] == ")" {
                    arr.remove(at: left)
                } else {
                    if arr[left] == "(" {
                        let dict = [left: "("]
                        stack.append(dict)
                    }
                    left += 1
                }
            } else {
                // 栈非空,取出栈顶元素进行匹配,能匹配上,就删除
                let topEle = stack[stack.count - 1]
                if topEle.first!.value == "(" && arr[left] == ")" {
                    stack.removeLast()
                }
                if arr[left] == "(" {
                    let dict = [left: "("]
                    stack.append(dict)
                }
                left += 1
            }
            
        }
        
        if !stack.isEmpty {
            for i in (0..<stack.count).reversed() {
                arr.remove(at: stack[i].first!.key)
            }
        }
        
        return arr.reduce("", +)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值