Leetcode 301. Remove Invalid Parentheses
来源:互联网 发布:苹果手机4g移动网络慢 编辑:程序博客网 时间:2024/05/18 03:45
题目:
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.
Note: The input string may contain letters other than the parentheses (
and)
.
BFS
首先定义一个函数valid,检验字符串中'('数量是否等于')'数量,当然,在从前往后遍历时,只要')'比'('数量多,就表明肯定失败,就不需要往后遍历了。
将字符串s压入队列中,如果队列不为空,取最前面元素出队,如果此字符串valid,将其压入result列表中,并将found置为true,否则,如果found不为true,那么删掉一个'('或')'作为字串,至于删除的位置,从头到尾哪个地方都可以,将新形成的字串们都压入队列中(前提是之前这个样子的字串没有出现过,因此要定义一个unordered_map来记录已经访问过的字符串)。当然found还有一个非常重要的作用,因为题目是要求最长串,因此一旦found为true了,那之后队列中出来的元素就不需要删除'('或')'形成子串了。
代码:
class Solution {public: vector<string> removeInvalidParentheses(string s) { vector<string> result; unordered_map<string, int> map; queue<string> q; q.push(s); map[s] = 1; bool found = false; while (!q.empty()){ string str = q.front(); q.pop(); if (valid(str)){ result.push_back(str); found = true; } if (found) continue; for (int i = 0; i < str.length(); i ++){ if (str[i] != '(' && str[i] != ')') continue; string sub = str.substr(0,i) + str.substr(i + 1); if (map.find(sub) == map.end()){ q.push(sub); map[sub] = 1; } } } return result; } bool valid(string s){ int count = 0; for (int i = 0; i < s.length(); i ++){ if (s[i] == '(') count ++; else if (s[i] == ')'){ if (count == 0) return false; count --; } } return count == 0; }};
DFS:
首先关注')',如果')'多出来了,那就需要删除一个,此处删除哪个都可以,那就删除最靠前的那个,然后用这个字串继续DFS,直到不需要删了,然后将得到的字符串倒过来,用相同的方法看有没有多余的'(',如果有就按之前的方法继续删,最终就能得到答案。
代码:
class Solution {public: void DFS(string s, char ch, int last) { 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)) DFS(s.substr(0, j)+s.substr(j+1), ch, j); } return; } reverse(s.begin(), s.end()); if(ch == ')') return DFS(s, '(', 0); ans.push_back(s); } vector<string> removeInvalidParentheses(string s) { DFS(s, ')', 0); return ans; }private: vector<string> ans;};
0 0
- Leetcode 301. Remove Invalid Parentheses
- leetcode 301. Remove Invalid Parentheses
- [leetcode] 301. Remove Invalid Parentheses
- leetcode.301. Remove Invalid Parentheses
- [LeetCode]--301. Remove Invalid Parentheses
- Leetcode 301. Remove Invalid Parentheses
- 【LeetCode】301. Remove Invalid Parentheses
- [LeetCode]301. Remove Invalid Parentheses
- Leetcode 301. Remove Invalid Parentheses
- leetcode 301. Remove Invalid Parentheses
- [leetcode]301. Remove Invalid Parentheses
- Leetcode: 301.Remove Invalid Parentheses
- [LeetCode] Remove Invalid Parentheses
- LeetCode -- Remove Invalid Parentheses
- leetcode Remove Invalid Parentheses
- LeetCode Remove Invalid Parentheses
- [Leetcode]Remove Invalid Parentheses
- leetcode:Remove Invalid Parentheses
- 20170405 杭州是个生活的好去处
- PHPStorm 中配置 XDebug 实现断点调试
- xcode8 中 dsym 文件位置
- windows编程几个响应函数介绍
- 升级Android studio后创建工程很慢的解决方法
- Leetcode 301. Remove Invalid Parentheses
- 中断及信号的定义
- 关于进程和线程
- 关于this指针的一个形象介绍
- JS模拟CSS3动画-贝塞尔曲线
- 基于VC6.0的MFC应用程序开发中的一…
- 程序员面试经典--巧用散列表
- 关于MySQL数据库的控制台操作的一…
- C++基础(一)