给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
在讲解这道题的时候我们先了解以下什么是栈结构。
栈结构
栈是一个很重要的结构,他遵循先进后出的原则在很多工程中都会用到。我们熟悉的递归其实也就是压栈的过程,系统将这次程序的全部信息压入到栈中,在执行自身的下一次程序,等到不满足递归条件的时候在逐层接着往下运行。
假设有这样一个程序,输入一个数,不断的让这个数减到0,如果不为0就重新执行自身直到0为止就返回(当让这个题正常用循环就可以做,循环也是比递归更佳的方法,但是为了通过递归讲解栈结构才引用的)
int Recursive(int num)
{
if (num == 0)
return num;
Recursive(--num);
cout << num << endl;
}
这个就是递归的时候压栈和弹栈的过程,如果一个程序可以使用for循环来做这是很好的,因为在压栈的过程中,不仅仅压入的是num的值,还有一些其他的东西。所以会比较占用空间。
不管是C++,java,还是python都是自带栈结构。C语言自行百度就不多赘述。
回到这道题就是使用栈结构来解的。
思路:
- 遍历这个字符串,如果遇到左括号(’(‘,’[’,’{’)那么我们就往栈中压入对应的右括号(’)’,’]’,’}’’)
- 遇到不是左括号的时候我们就比较栈顶和这个右括号,如果相等则弹出栈,接着往后遍历
- 遇到不相等的直接返回false
- 如果遇到的是右括号并且此时栈为空,那么也是返回false
- 跳出循环的时候如果栈为空则返回true,否则返回false
class Solution {
public:
bool isValid(string s)
{
if (!s.length())
return true;
stack<char> stk;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '(')
stk.push(')');
else if (s[i] == '[')
stk.push(']');
else if (s[i] == '{')
stk.push('}');
else
{
if (stk.empty()||stk.top() != s[i])
return false;
else
stk.pop();
}
}
return stk.empty();
}
};
今天的讲解就到这,我是小白。欢迎关注我的公众号我们一起变强。