leetcode - Remove Invalid Parentheses
2016-03-03 16:59
495 查看
题目:
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<string> &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()<cur.size())
{
res.clear();
res.push_back(cur);
}
return;
}
//要这个s[begin]
if(begin>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(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
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(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
//不要这个s[begin]
int i=begin;
i++;
int yaru=0;
while(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
vector<string> removeInvalidParentheses(string s)
{
if(s.empty())
{
return vector<string>(1,"");
}
if(s.size()==1)
{
if(s[0]=='('||s[0]==')')
s.pop_back();
return vector<string>(1,s);
}
int i=0;//s[i]是第一个'('
while(i<s.size() && s[i]!='(')
{
++i;
}
string cur;//cur是s[0:i-1]中去掉')'的字符串
for(int j=0;j<i;++j)
{
if(s[j]!=')')
cur.push_back(s[j]);
}
if(i==s.size())//s没有字符'('
{
return vector<string>(1,cur);
}
vector<string> res;
removeInvalidParentheses_core(s,i,0,cur,res);
sort(res.begin(),res.end());
res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
};
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<string> &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()<cur.size())
{
res.clear();
res.push_back(cur);
}
return;
}
//要这个s[begin]
if(begin>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(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
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(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,tmp_kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
//不要这个s[begin]
int i=begin;
i++;
int yaru=0;
while(i<s.size() && s[i]!='(' && s[i]!=')')
{
cur.push_back(s[i]);
++i;
++yaru;
}
removeInvalidParentheses_core(s,i,kuohao,cur,res);
while(yaru>0)
{
cur.pop_back();
--yaru;
}
}
vector<string> removeInvalidParentheses(string s)
{
if(s.empty())
{
return vector<string>(1,"");
}
if(s.size()==1)
{
if(s[0]=='('||s[0]==')')
s.pop_back();
return vector<string>(1,s);
}
int i=0;//s[i]是第一个'('
while(i<s.size() && s[i]!='(')
{
++i;
}
string cur;//cur是s[0:i-1]中去掉')'的字符串
for(int j=0;j<i;++j)
{
if(s[j]!=')')
cur.push_back(s[j]);
}
if(i==s.size())//s没有字符'('
{
return vector<string>(1,cur);
}
vector<string> res;
removeInvalidParentheses_core(s,i,0,cur,res);
sort(res.begin(),res.end());
res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 开发人员、程序员与计算机科学家三者之间的区别
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 程序员必备,程序员四大忌
- 程序员们,做好你手里的俩份试卷
- 程序员必备的10大健康装备! 我们要工作更要健康!
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一篇关于程序员性格的文章第1/3页
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 8种类型极品程序员,不知你属于哪一种?
- C++联合体转换成C#结构的实现方法
- 程序员编程从初级到中级的10个秘诀
- C++高级程序员成长之路
- C++编写简单的打靶游戏