Golang | Leetcode Golang题解之第301题删除无效的括号

题目:

题解:

func checkValid(str string, lmask, rmask int, left, right []int) bool {
    cnt := 0
    pos1, pos2 := 0, 0
    for i := range str {
        if pos1 < len(left) && i == left[pos1] {
            if lmask>>pos1&1 == 0 {
                cnt++
            }
            pos1++
        } else if pos2 < len(right) && i == right[pos2] {
            if rmask>>pos2&1 == 0 {
                cnt--
                if cnt < 0 {
                    return false
                }
            }
            pos2++
        }
    }
    return cnt == 0
}

func recoverStr(str string, lmask, rmask int, left, right []int) string {
    res := []rune{}
    pos1, pos2 := 0, 0
    for i, ch := range str {
        if pos1 < len(left) && i == left[pos1] {
            if lmask>>pos1&1 == 0 {
                res = append(res, ch)
            }
            pos1++
        } else if pos2 < len(right) && i == right[pos2] {
            if rmask>>pos2&1 == 0 {
                res = append(res, ch)
            }
            pos2++
        } else {
            res = append(res, ch)
        }
    }
    return string(res)
}

func removeInvalidParentheses(s string) (ans []string) {
    var left, right []int
    lremove, rremove := 0, 0
    for i, ch := range s {
        if ch == '(' {
            left = append(left, i)
            lremove++
        } else if ch == ')' {
            right = append(right, i)
            if lremove == 0 {
                rremove++
            } else {
                lremove--
            }
        }
    }

    var maskArr1, maskArr2 []int
    for i := 0; i < 1<<len(left); i++ {
        if bits.OnesCount(uint(i)) == lremove {
            maskArr1 = append(maskArr1, i)
        }
    }
    for i := 0; i < 1<<len(right); i++ {
        if bits.OnesCount(uint(i)) == rremove {
            maskArr2 = append(maskArr2, i)
        }
    }

    res := map[string]struct{}{}
    for _, mask1 := range maskArr1 {
        for _, mask2 := range maskArr2 {
            if checkValid(s, mask1, mask2, left, right) {
                res[recoverStr(s, mask1, mask2, left, right)] = struct{}{}
            }
        }
    }
    for str := range res {
        ans = append(ans, str)
    }
    return
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值