一、有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
二、思路解法
采用栈的思想(先进后出)来解决
public static bool IsValid(string s)
{
//创建一个栈
Stack stack = new Stack();
//字符串转化成字符数组
char[] chars = s.ToCharArray();
//循环遍历字符串每一个字符
for(int i = 0; i < chars.Length;i++)
{
bool single1 = chars[i] == '(';
bool single2 = chars[i] == '{';
bool single3 = chars[i] == '[';
//如果满足符号({[,则将他们存入栈内
if (single1 || single2 || single3)
{
stack.Push(chars[i]);
}
else
{
//栈为空,则返回FALSE
if (stack.Count == 0)
{
return false;
}
else//栈不为空
{
//弹出栈顶元素
char temp= (char)stack.Pop();
if (chars[i] == ')')
{
if (temp != '(')
{
return false;
}
}else if (chars[i] == '}')
{
if (temp != '{')
{
return false;
}
}else if (chars[i] == ']')
{
if (temp != '[')
{
return false;
}
}
}
}
}
return stack.Count == 0?true:false;
}
这段代码的主要思路就是:首先将字符串转化为字符数组,方便后续的每个字符的遍历,在for循环里面,当字符为“(”,“{”,“【”等符号的时候进行入栈操作。如果不是这三项符号的话,我首先会判断当前栈是否为空,为空则返回FALSE,如果不为空,我先取出当前栈的栈顶元素进行三项判断比较,当左符号和右符号不匹配的时候我就返回FALSE,循环最后结束后,我们判断栈顶是否是空,为空说明全部括号都匹配到了,如果不为空表示还有括号未进行匹配,这时候返回FALSE,最终得以解决这个问题。 三、测试代码:
string s = "(]";
bool flag = IsValid(s);
Console.WriteLine(flag);