题目内容
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解题
解题思路
除了“(]”不允许 “([)]” 也不允许
有开括就得有闭括,而且最先开的括必须最后闭合
解决办法每次遍历到是闭括号时,校验上一个开括是否为当前类型的
这样可以采用栈的数据结构来完成,每次开括就存入栈,闭括就取出栈顶元素判断是否为同种类的开括如果不是就返回false
代码实现
public class Solution {
public bool IsValid(string s) {
var stock = new Stack<char>();
foreach (var c in s)
{
//判断是否为开括
if (c == '(' || c == '[' || c == '{')
{
//存入栈
stock.Push(c);
}
else
{
//如果栈中不存在开括就就直接返回false
if (stock.Count == 0) return false;
//判断是那种闭括
if (c == ')')
{
//判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
if (stock.Pop() != '(') return false;
}
else if (c == ']')
{
//判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
if (stock.Pop() != '[') return false;
}
else
{
//判断上一个开括是否与当前这个闭括匹配,如果不匹配就返回false
if (stock.Pop() != '{') return false;
}
}
}
//如果栈中还有开括就直接返回false
return stock.Count == 0;
}
}
改进
改进思路
上面还有几个地方可以进行优化下
在判断是否为开括号的时候可以将他们存入字典,并返回相对应的括回符号
判断括回时候就只需要从栈中取出元素,判断字符是否相同即可
设置栈默认大小为:字符串长度/2这样可以减少栈扩容次数
代码实现
public class Solution {
/// <summary>
/// 映射
/// </summary>
private static readonly char[] Mapper;
static Solution()
{
//创建映射
Mapper = new char[126];
Mapper['('] = ')';
Mapper['['] = ']';
Mapper['{'] = '}';
}
public bool IsValid(string s)
{
//上面还有几个地方可以进行优化下
//在判断是否为开括号的时候可以将他们存入字典,并返回相对应的括回符号
//判断括回时候就只需要从栈中取出元素,判断字符是否相同即可
//设置栈默认大小为:字符串长度/2这样可以减少栈扩容次数
var stock = new Stack<char>(s.Length / 2);
foreach (var c in s)
{
var item = Mapper[c];
if (item == char.MinValue)
{
if (stock.Count == 0 || stock.Pop() != c) return false;
}
else
{
stock.Push(item);
}
}
//如果栈中还有开括就直接返回false
return stock.Count == 0;
}
}