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
原创粉丝点击