【深度优先搜索 DFS】Leecode-301. 删除无效的括号

举报
子都爱学习 发表于 2024/01/07 22:23:11 2024/01/07
【摘要】 【题目】给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按 任意顺序 返回。 示例 1:输入:s = "()())()"输出:["(())()","()()()"]示例 2:输入:s = "(a)())()"输出:["(a())()","(a)()()"]示例 3:输入:s = ")("输出:[""]【题解】题解1:思路 ...

【题目】

给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。

返回所有可能的结果。答案可以按 任意顺序 返回。

 

示例 1:

输入:s = "()())()"
输出:["(())()","()()()"]

示例 2:

输入:s = "(a)())()"
输出:["(a())()","(a)()()"]

示例 3:

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

【题解】

题解1:

  • 思路

     列出可能的树形图,对于给出的列表逐个遍历调用dfs

  • 复杂度

         时间复杂度:O(n2),空间复杂度:O(n)

  • 代码
class Solution:
    def removeInvalidParentheses(self, s: str) -> List[str]:
        res_length = -1     # 记录删除最小数量的无效括号的长度
        st = []             # 判断括号合法性的栈,用于剪枝
        ans = set()         # 记录答案(因为会重复所以要使用set来存储)     
        path = []           # 记录回溯路径
        n = len(s)

        def dfs(i: int) -> int:
            if i == len(s):
                if st == []:
                    nonlocal res_length
                    if res_length == -1:
                        # 只有第一次执行到此时才会更新res_length的值
                        res_length = len(path)
                    if len(path) == res_length:
                        ans.add(''.join(path))
                return 
            
            # 剪枝
            if n - i + len(path) < res_length:
                return 

            # 小写字母一定选 与st无关
            if s[i] not in '()':
                path.append(s[i])
                dfs(i + 1)
                path.pop()
            else:
                # 选
                path.append(s[i])   # 记录路径
                if s[i] == '(':
                    st.append(s[i]) # '(' 入栈
                    dfs(i + 1)
                    st.pop()        # 恢复现场
                elif s[i] == ')' and st:
                    last = st.pop() # ')' 出栈
                    dfs(i + 1)
                    st.append(last) # 恢复现场
                path.pop()          # 恢复现场

                # 不选
                dfs(i + 1)
        
        dfs(0)  # 回溯入口
        return list(ans)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。