leetcode 刷题 -尊龙官方平台

leetcode 刷题 -----删除无效括号(1)

el/2024/3/25 16:21:06

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

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

示例 1:

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

示例 2:

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

 示例 3:

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

提示:

1 <= s.length <= 25
s 由小写英文字母以及括号 '(' 和 ')' 组成
s 中至多含 20 个括号

思路:这种一步一步生成答案合集的,一般使用递归。

代码如下:

class solution {private list res = new arraylist();public list removeinvalidparentheses(string s) {int lremove = 0;int rremove = 0;for (int i = 0; i < s.length(); i  ) {if (s.charat(i) == '(') {lremove  ;} else if (s.charat(i) == ')') {if (lremove == 0) {rremove  ;} else {lremove--;}}}helper(s, 0, 0, 0, lremove, rremove);return res;}private void helper(string str, int start, int lcount, int rcount, int lremove, int rremove) {if (lremove == 0 && rremove == 0) {if (isvalid(str)) {res.add(str);}return;}for (int i = start; i < str.length(); i  ) {if (i != start && str.charat(i) == str.charat(i - 1)) {continue;}// 如果剩余的字符无法满足去掉的数量要求,直接返回if (lremove   rremove > str.length() - i) {return;}// 尝试去掉一个左括号if (lremove > 0 && str.charat(i) == '(') {helper(str.substring(0, i)   str.substring(i   1), i, lcount, rcount, lremove - 1, rremove);}// 尝试去掉一个右括号if (rremove > 0 && str.charat(i) == ')') {helper(str.substring(0, i)   str.substring(i   1), i, lcount, rcount, lremove, rremove - 1);}if (str.charat(i) == ')') {lcount  ;} else if (str.charat(i) == ')') {rcount  ;}// 当前右括号的数量大于左括号的数量则为非法,直接返回.if (rcount > lcount) {break;}}}private boolean isvalid(string str) {int cnt = 0;for (int i = 0; i < str.length(); i  ) {if (str.charat(i) == '(') {cnt  ;} else if (str.charat(i) == ')') {cnt--;if (cnt < 0) {return false;}}}return cnt == 0;}
}

http://www.ngui.cc/el/5126968.html

相关文章

leetcode 刷题 ----- 重新排序得到 2 的幂(2)

题目描述: 给定正整数 n ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。 如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。 示例如下&…

leetcode 刷题 ----- 路径交叉(3)

提示: 1 < distance.length < 1051 < distance[i] < 105 问题分析: 1.首先考虑,当线条数小于4时,是不肯有交叉的。每一个线段为1,线段是只能根据东南西北四个方向走动的。 2.线段条数大于等于 4 时&…

leetcode 刷题 -----删除指定节点(7)

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:指定链表中值为 5 的…

leetcode刷题----- 有效的完全平方数

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。 进阶:不要 使用任何内置的库函数,如 sqrt 。 解题思路: 完全平方指用一个整数乘以自己例如1…

leetcode 刷题 -----最长定差子序列(11)

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。 子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。 示例 1: 输入:arr = [1…

leetcode 刷题 ----丢失的数字(11)

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1: 输入:nums [3,0,1] 输出:2 解释:n 3,因为有 3 个数字,所以所有的数字都在范围 [0,…

leetcode 刷题 ----范围求和(12)

给定一个初始元素全部为 0,大小为 m*n 的矩阵 m 以及在 m 上的一系列更新操作。 操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 < i < a 以及 0 < j < b 的元素 m[i][j] 的值都…

leetcode刷题----猜数字游戏(13)

你在和朋友一起玩 猜数字(bulls and cows)游戏,该游戏规则如下: 写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示: 猜测数字中有多少位属于数字…

leetcode刷题----祖玛游戏(14)

在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 r、黄色 y、蓝色 b、绿色 g 或白色 w 。你的手中也有一些彩球。 你的目标是 清空 桌面上所有的球。每一回合: 从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一…

leetcode刷题---- 提莫攻击(14)

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。 当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。 正式地讲,提莫在 t 发起发起攻击…
网站地图