LeetCode Remove Invalid Parenthese

原创 2015年11月17日 22:17:04

LeetCode 每日刷题!!

Remove Invalid Parentheses

这道题在做的时候用到了BFS因为它要求的是最优解

层次依次为删除0个元素,1个元素,2个元素。。。

如果在一层找到符合要求的就返回

在做的时候考虑效率问题,要对BFS进行剪枝,不然会timelimit, 使用的方法一:出现过的就加入visited里面不再加入叶子节点,二:visited用hash,提高查找效率


#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <queue>
#include <stack>
#include <assert.h>
#include <set>
using namespace std;

class Solution {
public:
	vector<string> removeInvalidParentheses(string s) {
		set<string> visited;
		string *current = &s;
		vector<string> ans;
		vector<string> layerSet;
		vector<string> nextlayer;
		if (s == "")
		{
			ans.push_back("");
			return ans;
		}
		layerSet.push_back(s);

		while (layerSet.size() != 0)
		{
			//each layer of a BFT, the optimize have the least delete number
			//and each loop have the same delete num.
			for (int i = 0; i < layerSet.size(); i++)
			{
				*current = layerSet[i];
				if (isValid(*current))
				{
					ans.push_back(*current);
				}
				
			}
			if (ans.size() != 0)
			{
				return ans;
			}
			for (int i = 0; i < layerSet.size(); i++)
			{
				*current = layerSet[i];
				for (int i = 0; i < current->size(); i++)
				{
					if ((*current)[i] != '(' && (*current)[i] != ')')
					{
						continue;
					}
					string tmp = current->substr(0, i) + current->substr(i + 1);
					if (tmp == "")
					{
						ans.push_back("");
						return ans;
					}
					
					if (visited.find(tmp) == visited.end())
					{
						nextlayer.push_back(tmp);
						visited.insert(tmp);
					}

				}
			}
			layerSet.swap(nextlayer);
			
		}
		return ans;
	}

	bool isValid(string s)
	{
		int num = 0;
		if (s.size() == 0)
		{
			return false;
		}
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] == '(') {
				num++;
			}
			if (s[i] == ')') {
				num--;
			}
			if (num < 0)
				return false;
		}
		return num == 0;
	}
};

int main()
{
	string test1 = ")()m)(((()((()((((";
	vector<string> ans;
	Solution *solu = new Solution();
	ans = solu->removeInvalidParentheses(test1);
	for (int i = 0; i < ans.size(); i++)
	{
		cout << ans[i] << endl;
	}

	system("pause");
	return 0;


}


相关文章推荐

leetcode Remove Invalid Parentheses

好久没写博客了。。。蛤蛤 CSDN出了这个新的博客编辑器,有点点不习惯,嘿嘿。 我只是喜欢AC的感觉,喜欢认识问题,思考问题,想一些乱七八糟的思路,算法,然后各种debug(虽然这部分有时让我很苦...
  • modiz
  • modiz
  • 2015年11月05日 22:41
  • 434

【Leetcode】Remove Invalid Parentheses

题目链接:https://leetcode.com/problems/remove-invalid-parentheses/题目: Remove the minimum number of inva...
  • yeqiuzs
  • yeqiuzs
  • 2016年06月09日 18:59
  • 1640

LeetCode 301. Remove Invalid Parentheses(删除无效的括号)

原题网址:https://leetcode.com/problems/remove-invalid-parentheses/ Remove the minimum number of invali...
  • jmspan
  • jmspan
  • 2016年04月19日 04:44
  • 1140

leetcode 301. Remove Invalid Parentheses

Remove the minimum number of invalid parentheses in order to make the input string valid. Return all...

【LeetCode】301. Remove Invalid Parentheses

题目: Remove the minimum number of invalid parentheses in order to make the input string valid. Retur...

[leetcode] 301. Remove Invalid Parentheses

题目: Remove the minimum number of invalid parentheses in order to make the input string valid. Retur...

【Leetcode】301. Remove Invalid Parentheses 移除非法小括号

题目https://leetcode.com/problems/remove-invalid-parentheses/?tab=Solutions。 题意是给出一个string,其中的小括号可能不配对...

leetcode -- Remove Invalid Parentheses--又是DFS,BFS的题目

https://leetcode.com/problems/remove-invalid-parentheses/valid parentheses definition字符串中的左右括号数应该相同,...
  • xyqzki
  • xyqzki
  • 2015年12月25日 17:00
  • 2989

leetcode - Remove Invalid Parentheses

题目: https://leetcode.com/problems/remove-invalid-parentheses/ 思路: 广度优先遍历。在返回最终结果res前,注意去重! c...

LeetCode Remove Invalid Parentheses

Description: Remove the minimum number of invalid parentheses in order to make the input string...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode Remove Invalid Parenthese
举报原因:
原因补充:

(最多只允许输入30个字)