时间复杂度:O(n²)
解题思路
用BFS尝试删除字符串的每一个括号,然后记录下产生的新的字符串,如果有满足题意的字符串就返回(BFS保证删除的次数最少),如果没有就重复此过程。
为了提升效率,需要注意以下两点:
- 由于字符串可能会重复,所以用哈希表记录下所有的字符串,并且value值用空结构体。
- 对于连续的相同的括号,删除其中任意一个括号后产生的字符串相同,所以我们只需删除最左边的括号即可,后面的相同括号全部略过。
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能不能做。