Remove Invalid Parentheses
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)
.Examples:
"()())()" -> ["()()()", "(())()"] "(a)())()" -> ["(a)()()", "(a())()"] ")(" -> [""]Credits:
Special thanks to @hpplayer for adding this problem and creating all test cases.
An elegant BFS algorithm.
Each time we delete a ‘(‘ or ‘)’ and push it into the queue, then check its validity. if the current string is not valid and the result set is empty, delete a ‘(‘ or ‘)’ in current string and push it into the queue.
class Solution { public: vector<string> removeInvalidParentheses(string s) { //BFS queue<pair<string, int> > q; unordered_set<string> set; unordered_set<string> isVisited; // string is in q or not q.push(make_pair(s, 0)); isVisited.insert(s); while(!q.empty()){ int distance = q.front().second; string ss = q.front().first; q.pop(); if(isValid(ss)){ if(set.empty() || (*set.begin()).size() == ss.size()){ // same number of removal characters set.insert(ss); } } else{ // ss is not valid if(!set.empty()){ // at least one answer has found, no need to push new string into queue continue; } for(int i = 0; i < ss.size(); i++){ if(ss[i] != '(' && ss[i] != ')'){ // not a valid parenthese, ignore it continue; } if(i > 0 && ss[i] == ss[i - 1]){ // duplicate results, skip them continue; } string nextStr = ss.substr(0, i); if(i + 1 < ss.size()) nextStr.append(ss.substr(i + 1, -1)); if(isVisited.count(nextStr) == 0){ // not visited isVisited.insert(nextStr); q.push(make_pair(nextStr, distance + 1)); } } } } vector<string> ans; for(auto it = set.begin(); it != set.end(); it++){ ans.push_back(*it); } return ans; } bool isValid(string s){ int count = 0; for(int i = 0; i < s.size(); i++){ if(s[i] == '(') count++; if(s[i] == ')') count--; if(count < 0) return false; } return count == 0; } };