Leetcod20
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串
分析
已知:给定了一个字符串给我们。目标:判断里面是否为是有效字符串。
解法一
由题意可知:可以通过将字符串的每个元素都遍历一遍,然后将左半部分的括号时将其提出并输入进栈,在碰到右半部分的括号时候 判断此时栈的顶部的是否为其对应的那部分括号若是则删除栈的顶部的元素。反之则将其存入栈。如此通过判断该栈最后还有没有括号在里面由此来确定改字符串是否有效。
代码:
public class Solution
{
public bool IsValid(string s)
{
Stack<char> op = new Stack<char>();
op.Push('.');
if(s.Length==1)
{
return false;
}
foreach(var a in s)
{
switch(a)
{
case '(':op.Push(a);break;
case '{':op.Push(a);break;
case '[': op.Push(a);break;
case ')':
if(op.Peek()=='(')
{
op.Pop();
}
else
{
op.Push(a);
}
break;
case'}':
if(op.Peek()=='{')
{
op.Pop();
}
else
{
op.Push(a);
}
break;
case']':
if(op.Peek()=='[')
{
op.Pop();
}
else
{
op.Push(a);
}
break;
}
}
if(op.Count==1)
{
return true;
}
else
{
return false;
}
}
}
然而效果真的差
解法二
然后我思考了好久把代码修整简化了一遍
public class Solution
{
public bool IsValid(string s)
{
if (s.Length == 0) return true;
if (s.Length % 2 != 0) return false;
if (s[0] == ')' || s[0] == ']' || s[0] == '}')
return false;
Stack<int> sta = new Stack<int>();
foreach (var item in s)
{
if (item == '(' || item == '[' || item == '{')
sta.Push(item);
else if (sta.Count == 0 ||sta.Peek()+(sta.Peek()== '(' ? 1 : 2) != item)
return false;
else
sta.Pop();
}
return sta.Count == 0;
}
结果效果更差了