Leetcode 301. 删除无效的括号 困难 bfs
题目:
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
示例 1:
输入:s = "()())()"
输出:["(())()","()()()"]
思路:
删除字符串中的左右括号,使得字符串有效。
有效的定义就是左括号数量始终大于等于右括号。且两者总数目一致。
使用BFS,每次获取当前层的所有可能,如果存在有效字符串,则保存结果并返回当前层所有有效结果。
每层只在之前的基础上删掉一个括号。
使用unordered_set来过滤重复结果。
class Solution { public: vector<string> removeInvalidParentheses(string s) { vector<string> ret; unordered_set<string> cur_set; cur_set.insert(s); while(!cur_set.empty()){ unordered_set<string> next_set; for(auto& str:cur_set){ if(isValid(str)){ ret.push_back(str); } } if(!ret.empty()){ return ret; } for(auto& str:cur_set){ for(int i=0;i<str.size();++i){ if(i>0&&str[i]==str[i-1]) continue; string next=str.substr(0,i)+str.substr(i+1,str.size()); next_set.insert(next); } } cur_set=next_set; } return ret; } bool isValid(string s){ int left=0,right=0; for(auto& c:s){ if(c=='(') left++; else if(c==')') right++; if(right>left) return false; } return left==right; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=

浙公网安备 33010602011771号