首页 > 301 Remove Invalid Parentheses 删除无效的括号

301 Remove Invalid Parentheses 删除无效的括号

删除最小数目的无效括号,使输入的字符串有效,返回所有可能的结果。

注意: 输入可能包含了除 ( 和 ) 以外的元素。

示例 :

"()())()" -> ["()()()", "(())()"]

"(a)())()" -> ["(a)()()", "(a())()"]

")(" -> [""]

详见:https://leetcode.com/problems/remove-invalid-parentheses/description/

方法一:

class Solution {  
public:  vector removeInvalidParentheses(string s) {  vector ans; helperDFS(s, ')', 0,ans);  return ans;  }  void helperDFS(string s, char ch, int last,vector &ans)  {  for(int i = 0, cnt = 0; i < s.size(); i++)  {  if(s[i]=='('||s[i]==')'){s[i]==ch?cnt++:cnt--; }if(cnt <= 0){continue;  }for(int j = last; j <= i; j++)  {  if(s[j] == ch && (j ==last || s[j-1]!= ch))  {helperDFS(s.substr(0, j)+s.substr(j+1), ch, j,ans);  }}  return;  }  reverse(s.begin(), s.end());  if(ch == ')'){return helperDFS(s, '(', 0,ans);  }ans.push_back(s);  }  
};  

 方法二:

class Solution {
public:vector removeInvalidParentheses(string s) {vector res;unordered_set visited{ {s}};queue q{ {s}};bool found = false;while (!q.empty()){string t = q.front();q.pop();if (isValid(t)) {res.push_back(t);found = true;}if (found){continue;}for (int i = 0; i < t.size(); ++i) {if (t[i] != '(' && t[i] != ')'){continue;}string str = t.substr(0, i) + t.substr(i + 1);if (!visited.count(str)) {q.push(str);visited.insert(str);}}}return res;}bool isValid(string t) {int cnt = 0;for (int i = 0; i < t.size(); ++i) {if (t[i] == '('){++cnt;}else if (t[i] == ')' && --cnt < 0){return false;}}return cnt == 0;}
};

 参考:https://blog.csdn.net/qq508618087/article/details/50408894

https://www.cnblogs.com/grandyang/p/4944875.html

转载于:https://www.cnblogs.com/xidian2014/p/8781578.html

更多相关:

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...

  • #include #include #include #include #include #include #include

  • 题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...

  • 加法伺候  //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...

  • 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程...

  • 简单record 一下 #include // 'struct sockaddr_in' #include #include // 'struct ifreq' and 'struct if_nameindex' #include #inc...

  • 把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了。但是这样会有一个问题就是串的长度有2e5,26的2e5次方显然不可求,所以需要对每一位进行手动的加和运算。对于两个串,我们假设a串从后往前的每一位对应的数值为a0, a1,...

  • 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。 抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。 代码如下: #include #include #inc...