leetcode 有效的括号
最开始的解题思路(列题没有全部通过)
1.先判断是不是偶数,不是偶数肯定false
2.利用string模板的erase接口删除相邻可以匹配的括号(利用函数panduan1实现)
3.再利用我的另外一个函数panduan2(初学者见谅),进行首尾的括号判断
第二次的思路(列题全部通过)
将panduan1函数重复利用,判断string的长度是否为0
优化思路
panduan1的函数可以进行优化再每次匹配成功的过程进行t–,就可以省去第一个while。
代码如下:
class Solution {
public:
void panduan1(string &s)
{
int t=0,size=s.length(),next=size;
while(1){
while(t<next-1)
{
next=s.length();
if(s[t]=='['&&s[t+1]==']')
{
s=s.erase(t+1,1);
s=s.erase(t,1);
}
else if(s[t]=='{'&&s[t+1]=='}')
{
s=s.erase(t+1,1);
s=s.erase(t,1);
}
else if(s[t]=='('&&s[t+1]==')')
{
s=s.erase(t+1,1);
s=s.erase(t,1);
}
else
{
t++;
}
}
t=0;
if(next==0)//说明没有配对括号了
{
return;
}
else if(next==size)
{
return;
}
else
{
size=next;
}
}
}
bool panduan2(string &s)//判断2这个后期第一个对最后一个函数会错误,建议多执行判断1
{
int head=0,t,fail=s.length();
while(fail=s.length()){
if(s[head]=='['&&s[fail-1]==']')
{
s=s.erase(fail-1,1);
s=s.erase(head,1);
}
else if(s[head]=='{'&&s[fail-1]=='}')
{
s=s.erase(fail-1,1);
s=s.erase(head,1);
}
else if(s[head]=='('&&s[fail-1]==')')
{
s=s.erase(fail-1,1);
s=s.erase(head,1);
}
else
{
return false;
}
}
return true;
}
bool isValid(string s) {
int head=0,t,fail=s.length();//尝试利用erase()删除,而不是用标记法
if(fail%2==0)
{
panduan1(s);
if(s.length()==0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
};