📅  最后修改于: 2023-12-03 15:28:42.045000             🧑  作者: Mango
给定一个由'(',')','{','}','['和']'组成的字符串,编写一个函数来检查该字符串是否有效。
有效字符串需满足:
注意空字符串可被认为是有效字符串。
示例1:
输入: "()"
输出: true
示例2:
输入: "()[]{}"
输出: true
示例3:
输入: "(]"
输出: false
示例4:
输入: "([)]"
输出: false
示例5:
输入: "{[]}"
输出: true
这是一道很经典的栈的使用题目。栈是一种先进后出的数据结构,在这道题中我们可以使用栈来解决。
首先我们先对字符串进行遍历,同等级开口的字符入栈,遇到同等级闭合的字符时出栈。若遇到不同等级的闭合字符无法出栈,或者遍历完字符串后栈中还有字符未被匹配完全,则说明字符串无效。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
mapping = {")": "(", "}": "{", "]": "["}
for char in s:
if char in mapping:
top_element = stack.pop() if stack else '#'
if mapping[char] != top_element:
return False
else:
stack.append(char)
return not stack
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
}
class Solution {
public:
bool isValid(string s) {
stack<char> paren;
for (auto c : s) {
if (c == '(' || c == '[' || c == '{')
paren.push(c);
else if (paren.empty())
return false;
else if (c == ')' && paren.top() == '(' || c == ']' && paren.top() == '[' || c == '}' && paren.top() == '{')
paren.pop();
else
return false;
}
return paren.empty();
}
};
本题时间复杂度为O(n),n为字符串的长度,因为字符串只会遍历一遍。
空间复杂度为O(n),在最坏情况下,栈的深度最大为n。