LeetCode0301.删除无效的括号 Go语言AC笔记

时间复杂度:O(n²)

解题思路

用BFS尝试删除字符串的每一个括号,然后记录下产生的新的字符串,如果有满足题意的字符串就返回(BFS保证删除的次数最少),如果没有就重复此过程。

为了提升效率,需要注意以下两点:

  1. 由于字符串可能会重复,所以用哈希表记录下所有的字符串,并且value值用空结构体。
  2. 对于连续的相同的括号,删除其中任意一个括号后产生的字符串相同,所以我们只需删除最左边的括号即可,后面的相同括号全部略过。

AC代码

func removeInvalidParentheses(s string) (res []string) {
    strQueue:=map[string]struct{}{s:{}}//存放等待删除括号的所有字符串,用哈希表消除重复的字符串
    for{
        //每次遍历所有待删除括号的字符串前,先检查是否有一个满足题意的字符串
        for str:=range strQueue{
            if isValid(str){
                res=append(res,str)
            }
        }
        //由于是BFS,如果有满足题意的字符串就可以直接返回了,保证删除的次数最少
        if len(res)>0{
            return res
        }
        //由于需要遍历旧哈希表且需要存放新的删除括号后的字符串,所以将新字符串存到新的哈希表中
        newQueue:=make(map[string]struct{})
        for str:=range strQueue{
            for i,ch:=range str{
                if i>0&&byte(ch)==str[i-1]{//此处是消除重复情况,对于连续的相同括号,只删除最左的括号即可
                    continue
                }
                if ch=='('||ch==')'{//尝试删除每个括号
                    newQueue[str[:i]+str[i+1:]]=struct{}{}//将得到的删除括号后的字符串存放到哈希表中
                }
            }
        }
        strQueue=newQueue//下一次遍历新的哈希表
    }
}

func isValid(str string)bool{
    count:=0
    for _,ch:=range str{
        if ch=='('{
            count++
        }else if ch==')'{
            count--
            if count<0{
                return false
            }
        }
    }
    return count==0
}

感悟

对于提到“最少”的题目,都可以考虑考虑BFS能不能做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值