leetcode - Remove Invalid Parentheses

题目:

https://leetcode.com/problems/remove-invalid-parentheses/

思路:

广度优先遍历。在返回最终结果res前,注意去重!


class Solution
{
public:
	//参数kuohao代表此次递归里cur中左括号数量减去右括号数量的值,可见kuohao是非负整数
	void removeInvalidParentheses_core(string &s,int begin,int kuohao,string &cur,vector &res)
	{
		//s[begin]肯定是待处理的'('或')'
		if(begin==s.size())//递归截止条件
		{
			if(kuohao!=0)
				return;
			if(res.empty() || res[0].size()==cur.size())
				res.push_back(cur);
			if(!res.empty() && res[0].size()s.size())
			return;
		if(s[begin]=='(' && (s.size()-begin-1>=1+kuohao))
		{
			int yaru=1,tmp_kuohao=kuohao;
			cur.push_back(s[begin]);
			int i=begin+1;
			++tmp_kuohao;

			while(i0)
			{
				cur.pop_back();
				--yaru;
			}

		}
		else if(s[begin]==')' && kuohao>0)
		{
			int yaru=1,tmp_kuohao=kuohao;
			cur.push_back(s[begin]);
			int i=begin+1;
			--tmp_kuohao;

			while(i0)
			{
				cur.pop_back();
				--yaru;
			}
		}
		//不要这个s[begin]
		int i=begin;
		i++;
		int yaru=0;
		while(i0)
		{
			cur.pop_back();
			--yaru;
		}
	}

	vector removeInvalidParentheses(string s)
	{
		if(s.empty())
		{
			return vector(1,"");
		}
		if(s.size()==1)
		{
			if(s[0]=='('||s[0]==')')
				s.pop_back();
			return vector(1,s);
		}

		int i=0;//s[i]是第一个'('
		while(i(1,cur);
		}
		vector res;
		removeInvalidParentheses_core(s,i,0,cur,res);
		sort(res.begin(),res.end());
		res.erase(unique(res.begin(),res.end()),res.end());
		return res;
	}
};


你可能感兴趣的:(leetcode)