题目一:如果字符串满足以下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):
字符串是一个空字符串 "",或者是一个不为 "(" 或 ")" 的单字符。
字符串可以写为 AB(A 与 B 字符串连接),其中 A 和 B 都是 有效括号字符串 。
字符串可以写为 (A),其中 A 是一个 有效括号字符串 。
类似地,可以定义任何有效括号字符串 S 的 嵌套深度 depth(S):
depth("") = 0
depth(C) = 0,其中 C 是单个字符的字符串,且该字符不是 "(" 或者 ")"
depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括号字符串
depth("(" + A + ")") = 1 + depth(A),其中 A 是一个 有效括号字符串
例如:""、"()()"、"()(()())" 都是 有效括号字符串(嵌套深度分别为 0、1、2),而 ")(" 、"(()" 都不是 有效括号字符串 。
给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 。
示例 1:输入:s = "(1+(2*3)+((8)/4))+1"
输出:3
解释:数字 8 在嵌套的 3 层括号中。
示例 2:输入:s = "(1)+((2))+(((3)))"
输出:3
示例 3:输入:s = "1+(2*3)/(2-1)"
输出:1
示例 4:输入:s = "1"
输出:0
分析:对于括号问题,要想到栈,这里括号的深度只与‘( ’和‘ )’有关系,所以我们遍历字符串,遇到左括号就入栈,遇到右括号就出栈。这里我们只需要考虑栈的大小,同时注意所求为最大括号深度(可绘图理解)
代码如下:
class Solution {
public:
int maxDepth(string s) {
int maxd,size;
//遍历字符串
for(char ch:s){
//左括号就++
if(ch=='('){
size++;
}
//右括号就--
else if(ch==')'){
size--;
}
//找最大的括号深度,所以要考虑到
//例如:"(1+(2*3)+((8)/4))+1"
maxd=max(size,maxd);
}
return maxd;
}
};
题目二:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:输入:s = "()"
输出:true
示例 2:输入:s = "()[]{}"
输出:true
示例 3:输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
分析:对于括号问题,要想到栈。碰到左括号就入栈,碰到右括号就查看栈顶的元素是否为对应的左括号。同时当字符串为奇数个数时,肯定不有效(可绘图理解)
代码如下:
class Solution {
public:
stack<char>Stack;
bool isValid(string s) {
char ch;
//字符串个数为奇,直接返回false
if(s.size() & 1){
return false;
}
//遍历字符串
for (int i = 0; i < s.size(); i++) {
//左括号入栈
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
Stack.push(s[i]);
}
//右括号
else {
//如果栈为空,肯定不有效
if (Stack.empty()) {
return false;
}
//栈不为空
else {
//栈顶元素与当前字符是否对应
//对应的话,栈顶元素出栈
ch = Stack.top();
if (s[i] == ')' && ch == '('){
Stack.pop();
}
else if(s[i] == ']' && ch == '['){
Stack.pop();
}
else if(s[i] == '}' && ch == '{'){
Stack.pop();
}
//不对应,肯定无效
else{
return false;
}
}
}
}
//最后整个结束,栈为空说明有效
return Stack.empty();
}
};
总结:遇到括号问题,要想到栈。因为一个左括号必定与一个右括号对应(有效括号),符合栈的特点。左括号有的话就 push 进来,找到右括号就可以把栈顶的左括号给 pop 删除掉,很适合使用栈来解决这类问题。同时这里还有一个判断奇数的方法,值得一记