LeetCode HOT 100 —— 301.删除无效的括号

news/2024/9/22 20:36:03/

题目

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

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

在这里插入图片描述

思路

DFS 回溯算法:

首先最终合法的方案,必然有左括号的数量 = 右括号的数量

如果左括号的得分为 1;右括号的得分为 -1,那么对于合法的方案而言,必定满足最终得分为 0

同时可以预处理出「爆搜」过程的最大得分: max = min(左括号的数量, 右括号的数量),其中「爆搜」过程的最大得分必然是:合法左括号先全部出现在左边,之后使用最多的合法右括号进行匹配

枚举过程中出现字符分三种情况:

  • 普通字符:无须删除,直接添加
  • 左括号:如果当前得分不超过 max - 1 时,可以选择添加该左括号,也能选择不添加
  • 右括号:如果当前得分大于 0(说明有一个左括号可以与之匹配),可以选择添加该右括号,也能选择不添加

使用 Set 进行方案去重,len 记录「爆搜」过程中的最大子串,然后将所有结果集中长度为 len 的子串加入答案。

java代码如下:

class Solution {Set<String> set = new HashSet<>();int n, max, len;String s;public List<String> removeInvalidParentheses(String _s) {s = _s;n = s.length();int l = 0, r = 0;for (char c : s.toCharArray()) {if (c == '(') l++;else if (c == ')') r++;}// 这个max很容易漏掉max = Math.min(l, r);dfs(0, "", 0);return new ArrayList<>(set);}// u: 字符串下标,表示当前要处理原始字符串u下标的字符。u其实也是递归的深度// cur: 增加)、(、普通字符后的字符串// score: 增加)、(、普通字符后的得分void dfs(int u, String cur, int score) {// 不得不佩服 score > max 这个判断if (score < 0 || score > max) return ;// n: 原始字符串长度// u == n 代表对原始字符串处理完成了if (u == n) {// score == 0 代表 cur 字符串合法if (score == 0 && cur.length() >= len) {// 这里为什么要对set进行clear?// len 代表啥?叶姐原话:len 记录「爆搜」过程中的最大子串,然后只保留长度等于 lenlen 的子串。// 什么情况下 cur.length() > len?// 先追溯 len 的赋值。len是由上一次入列时的cur.length赋值的,现在的cur.length > len,说明cur变长了// 以 "(a)()" 字符串为例,执行到此的cur,可能为 "a"或"(a)", set里放的,可能就是"a",而"a"不是我们要的答案,所以clear// clear 会不会把合法的字符串给清掉。自然不会,有上面的len限制着,短字符串没这个能力进来clearif (cur.length() > len) set.clear();len = cur.length();// 入列set.add(cur);}return ;}// 注意:u是对源字符串进行取数char c = s.charAt(u);if (c == '(') {dfs(u + 1, cur + String.valueOf(c), score + 1);// 遇到了 (,但是不加上,就代表要删除了。dfs(u + 1, cur, score);} else if (c == ')') {dfs(u + 1, cur + String.valueOf(c), score - 1);// 遇到了 ),但是不加上,就代表要删除了。dfs(u + 1, cur, score);} else {// 普通字符,直接添加dfs(u + 1, cur + String.valueOf(c), score);}}
}

http://www.ppmy.cn/news/4566.html

相关文章

HCIE-12.9 杭州战报

一、前言 本篇文章是本人12.9日在杭州参加HCIE-RS考试的战报&#xff0c;供在元旦之前参加HCIE-RS考试赶末班车的大佬们参考&#xff0c;近期不参加考试的大佬们可以不用理会。 近期HCIE顺利通过&#xff0c;下一步计划更新前两年在学习数学建模过程中的有关笔记&#xff0c;有…

傻白入门芯片设计,盘点半导体业界的大佬(十六)

目录 一、台积电TSMC &#xff08;1&#xff09;姓名&#xff1a;胡正明 &#xff08;2&#xff09;姓名&#xff1a;林本坚 &#xff08;3&#xff09;姓名&#xff1a;余振华 &#xff08;4&#xff09;姓名&#xff1a;米玉杰 &#xff08;5&#xff09;姓名&#xff1…

25.Django大型电商项目之地址管理——如何使用三级联动菜单数据加载地址、保存数据、动态获取数据、设置默认值

1. 地址管理基本页面 1.1 概述 1.2 流程 修改templates的跳转链接center.html <ul><li><a href"/userapp/address/">地址管理</a></li> </ul>templates {% extends base.html %} {% block title %}用户中心{% endblock %} {…

多元宇宙算法求解电力系统多目标优化问题(Matlab实现)【电气期刊论文复现与算例创新】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

两台linux服务器rsync自动备份文件

检查rsycn是否安装 检查方法&#xff1a;rpm -qa rsync 出现rsync 包名就是安装了 安装rsycn rsync的安装可以使用yum直接安装&#xff1a;yum install rsync rsycn的服务端/文件接收端配置 1、先创建备份目录 mkdir /data/xsbak2、服务端需要开启rsyncd服务&#xff0c;添加…

css知识复习点

四种css使用方式&#xff1a;内嵌式、外链式、行内式、导入式 复合选择器 后代选择器 选择器之间需要用空格隔开&#xff0c;后代不一定是儿子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>复合…

Win11+RTX3060+Anconda+CUDA11.3+cuDNN8.2+Pytorch1.10一条龙服务2

Win11RTX3060AncondaCUDA11.3cuDNN8.2Pytorch1.10一条龙服务 &#xff08;1&#xff09;查看安装了哪些包 conda list&#xff08;2)查看当前存在哪些虚拟环境 conda env list &#xff08;3&#xff09;创建虚拟环境&#xff0c;你可以创建好几个虚拟环境&#xff0c;虚拟环…

循环神经网络(RNN)

卷积神经网络和循环神经网络的区别 神经网络的基本原理是:一层中的所有神经元都接受一个输入,将其乘以一个权重,然后经过神经元的偏差进行调整,最后用激励函数把输出值标准化,得到一个神经元的输出。最后将一层中所有神经元的输出相加得到该层的输出。比如卷积神经网络,…