题目描述
算法描述
(辅助栈)因为最早出现的左括号对应的右括号最晚出现,与栈的存储形式及其相似,所以利用辅助栈,若是左括号则将入栈。若检测到右括号则检测栈顶。若不是对应左括号则返回false,当遍历完字符串且栈为空是返回false。
需要注意空字符串的特殊情况。
至于如何教计算机判断左括号对应的右括号,考虑到成对出现,可用哈希表进行存储。
代码实现
(C# 参考)
public class Solution {
public bool IsValid(string s)
{
Dictionary<char,char> map = new Dictionary<char,char>
{
{']','['},
{'}','{'},
{')','('}
};
var stack = new Stack<char>();
foreach(var item in s)
{
if(map.ContainsKey(item))
{
if(stack.Count==0)
return false;
else
{
var element=stack.Pop();
if(element!=map[item])
{return false;}
}
}
else stack.Push(item);
}
if(stack.Count==0) return true;
else return false;
}
}
(C#)利用ASCII的有趣解法
public bool IsValid(string s)
{
if (s.Length % 2 == 1) return false;
Stack<char> stack = new Stack<char>();
foreach(char c in s)
{
if (stack.Count == 0) stack.Push(c); else if (c - stack.Peek() == 1 || c - stack.Peek() == 2) stack.Pop(); else stack.Push(c);
}
return stack.Count == 0;
}