zoukankan      html  css  js  c++  java
  • leetcode刷题笔记301题 删除无效的括号

    leetcode刷题笔记301题 删除无效的括号

    源地址:301. 删除无效的括号

    问题描述:

    删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。

    说明: 输入可能包含了除 ( 和 ) 以外的字符。

    示例 1:

    输入: "()())()"
    输出: ["()()()", "(())()"]
    示例 2:

    输入: "(a)())()"
    输出: ["(a)()()", "(a())()"]
    示例 3:

    输入: ")("
    输出: [""]

    //合法括号构成需满足至少以下两个条件:
    //1.左括号数 == 右括号数
    //2.任意前缀 左括号数 >= 右括号数
    import scala.collection.mutable.ListBuffer
    object Solution {
        def removeInvalidParentheses(s: String): List[String] = {
            //res:结果, l: 左括号比右括号多的个数 r:未匹配的右括号数 
            var res = ListBuffer[String]()
            var l = 0
            var r = 0
    
            for (x <- s) {
                if (x == '(') l += 1
                else if (x == ')'){
                    if (l == 0) r += 1
                    else l -= 1
                }
            }
            dfs(s, 0, "", 0, l, r)
    
            def dfs(s: String, u: Int, path: String, cnt: Int, l: Int, r: Int): Unit = {
                //遍历结束
                if (u == s.length) {
                    //println("path: " + path)
                    //左右括号数相等
                    if (cnt == 0) {
                       //println("cnt: " + cnt)
                       res.append(path) 
                    }
                    return
                }
    
                //当前字符非左右括号直接添加
                if (s(u) != '(' && s(u) != ')') dfs(s, u+1, path+s(u), cnt, l, r)
                //左侧括号处理
                else if (s(u) == '('){
                    var cl = l
                    var cPath = path
                    //var cr = r
                    var cCnt = cnt
                    var k = u 
                    //处理连续的左括号
                    while(k < s.length && s(k) == '(') k += 1
                    cl -= k - u
                    //println("k-u: " + (k-u))
                    for (i <- (0 to k-u).reverse) {
                        println("i: " + i)
                        //仍有未匹配的左括号需要处理
                        if (cl >= 0) dfs(s, k, cPath, cCnt, cl, r)
                        cPath += '('
                        cCnt += 1
                        cl += 1
                    }  
                } else if (s(u) == ')') {
                    //var cl = l
                    var cr = r
                    var cCnt = cnt
                    var cPath = path
                    var k = u 
                    while(k < s.length && s(k) == ')') k += 1
                    cr -= k - u
                    for (i <- (0 to k-u).reverse) {
                        if (cCnt >=0 &&cr >= 0) dfs(s, k, cPath, cCnt, l, cr)
                        cPath += ')'
                        cCnt -= 1
                        cr += 1
                    }             
                }
            }
    
            return res.toList
        }
    }
    
    import "fmt"
    
    var res = []string{}
    
    func removeInvalidParentheses(s string) []string {
        res = []string{}
        left := 0
        right := 0
        for _, val := range s {
            if val == '(' {
                left += 1
            }else if val == ')' {
                if left == 0 {
                    right += 1  
                }else {
                    left -= 1
                }
            }
        }
        dfs(s, 0, "", 0, left, right)
        return res
    }
    
    func dfs(s string, u int, path string, cnt int, left int, right int) {
        if u == len(s) {
            //fmt.Printf("u: %d, len(s):%d
    ", u, len(s))
            if cnt == 0 {
                //fmt.Printf("path: %s
    ", path) 
                res = append(res, path)
            }
            return
        } 
    
        if s[u] != '(' && s[u] != ')'{
            dfs(s, u+1, path+string(s[u]), cnt, left, right)
        } else if s[u] == '(' {
            k := u
            //fmt.Printf("k: %d, u: %d
    ", k, u)
            for (k < len(s) && s[k] == '('){
                k++
            }
            //fmt.Printf("k: %d, u: %d
    ", k, u)
            left -= k-u
            for i := k-u; i >= 0; i--{
                if left >= 0{
                    dfs(s, k, path, cnt, left, right)    
                }
                path += string('(')
                //fmt.Printf("path: %s
    ", path)
                cnt ++
                left ++
            }
        } else if s[u] == ')' {
            k := u
            for (k < len(s) && s[k] == ')'){
                k++
            }
            right -= k-u
            for i := k-u; i >= 0; i--{
                if right >= 0 && cnt >= 0 {
                    dfs(s, k, path, cnt, left, right)
                }
                path += string(')')
                cnt --
                right ++
            }
        }
    
    }
    
  • 相关阅读:
    Exp9 Web安全基础
    Exp 8 Web基础 ——20175201张驰
    Exp7 网络欺诈防范 20175201张驰
    《知识付费平台》个人报告——20175201张驰
    20175201 EXP6 MSF基础应用
    Exp5 信息搜集与漏洞扫描——20175201张驰
    Exp4 恶意代码分析—20175201张驰
    20175201张驰exp3——免杀原理与实践
    #20175201张驰 网络对抗exp2——后门原理与实践
    20175201张驰 网络对抗exp1—PC平台逆向破解
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14030404.html
Copyright © 2011-2022 走看看