当前位置:网站首页>13 -- 移除无效的括号

13 -- 移除无效的括号

2022-06-24 06:56:00 JH_Cao

移除无效的括号

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("", +)
    }
}
原网站

版权声明
本文为[JH_Cao]所创,转载请带上原文链接,感谢
https://blog.csdn.net/JH_Cao/article/details/125437862