题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
c#
思路
1. foreach循环
1.1. 基本概念
C#中的foreach循环与for循环有很多的相似之处,foreach主要是用来循环集合的,不需要使用循环变量,相比for循环更容易使用。
foreach循环的原理,可以理解为从一个容器中拿数据,但它不需要确定从哪个数据开始拿,也不用确定拿多少个,foreach会智能的从容器中拿数据,可以理解为for语句的智能版。
1.2. 基本语法
C#的foreach语句的基本语法如下:
foreach(数据类型 变量名 in 集合)
{
循环体,变量名就是循环出来的数据。
}
官方给的思路,大概就是利用foreach循环,遍历给定集合中的左符号‘(’,‘[’,‘{’,并将其存储到自定义的栈中,同时判断存入栈的栈顶元素与遍历得到的右符号是否是一对,是的话就将此时的栈顶元素除去,进行下一步重复操作;否则直接返回false,跳出循环。最后判断栈中元素是否全清空,清空完毕返回true,反之false.
public class Solution {
public bool IsValid(string s) {
//三种特殊情况直接得到返回值
if (s.Length == 0)
{
return true;
}
if (s[0] == ')' || s[0] == '}' || s[0] == ']')
{
return false;
}
if (s.Length % 2 == 1)
{
return false;
}
Stack<Char> stack = new Stack<Char>();
foreach (var i in s)
{
if (i == '(' || i == '{' || i == '[')
{
stack.Push(i);
}
else if(i==')')
{
if (stack.Pop() != '(')
return false;
}
else if (i == '}')
{
if (stack.Pop() != '{')
return false;
}
else if (i == ']')
{
if (stack.Pop() != '[')
return false;
}
}
return stack.Count == 0;
}
}