题目:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
Step1:判断字符串的长度是奇数,则直接返回False,然后创建一个空栈和一个括号匹配的哈希map用于存储对应的括号。
Step2:遍历字符串的每个字符:
如果当前字符是左括号(‘(’,‘{’ 或 ‘[’),则将其压入栈中。
如果当前字符是右括号(‘)’,‘}’ 或 ‘]’),则进行匹配判断:
如果栈为空,或者栈顶元素不是与当前字符匹配的左括号,则返 回 False。
如果栈顶元素是与当前字符匹配的左括号,则将栈顶元素出栈,继续处理下一个字符。
Step3:在遍历结束后,如果栈为空,则返回 True;否则,返回 False。
代码程序(Python):
def isValid(self, s):
stack = []
mapping = {'(': ')', '[': ']', '{': '}'}
if len(s) % 2 != 0:
return False
for char in s:
if char in mapping:
# char是左括号,就把对应的右括号压入栈中
stack.append(mapping[char])
else:
# char是右括号,需要进行判断,栈是否为空或者栈顶元素stack[-1]是否和char进行匹配
if not stack or stack[-1] != char:
return False
else:
stack.pop()
return not stack
算法测试:
算法时间空间复杂度分析:
使用 Python 函数的时间复杂度分析:
遍历输入字符串需要 O(n) 的时间,其中 n 是字符串的长度。
在遍历过程中,对于每个字符,我们需要执行一些操作,如查找哈希表中的映射关系、栈的入栈和出栈操作,这些操作的时间复杂度都是 O(1)。
最终,时间复杂度为 O(n)。
使用 Python 函数的空间复杂度分析:
**使用了一个栈来存储左括号,栈的空间复杂度为 O(n),其中 n 是字符串的长度。
哈希表用于存储括号的映射关系,由于括号的种类是固定的,因此哈希表的空间复杂度是 O(1)。
因此,总的空间复杂度为 O(n)。
代码程序(C++):
bool isValid(string s){
unordered_map<char, char> pair = {
{'(', ')'}, {'[', ']'}, {'{', '}'}
};
stack<char> stk;
if(s.size() % 2 != 0)
return false;
for(int i = 0; i < s.size(); i++){
if(pair.find(s[i]) != pair.end()){
// 如果字符是左括号,就把对应的右括号加入栈中。
stk.push(pair[s[i]]);
}else{
//如果字符是右括号,则进行字符匹配
if(stk.empty() || stk.top() != s[i]){
return false;
}
stk.pop();
}
}
return stk.empty();
}
算法测试:
**算法空间时间复杂度分析:
使用 C++ 函数的时间复杂度分析:
遍历输入字符串需要 O(n) 的时间,其中 n 是字符串的长度。
在遍历过程中,对于每个字符,我们需要执行一些操作,如哈希表的查找、栈的入栈和出栈操作,这些操作的时间复杂度都是 O(1)。
最终,时间复杂度为 O(n)。
使用 C++ 函数的空间复杂度分析::
使用了一个栈来存储左括号,栈的空间复杂度为 O(n),其中 n 是字符串的长度。
哈希表用于存储括号的映射关系,由于括号的种类是固定的,因此哈希表的空间复杂度是 O(1)。
因此,总的空间复杂度为 O(n)。
也有其他求解有效括号匹配的算法比如:使用递归、使用一个计数器的,但是使用栈是最常用的解决方法,就不提供其他解题算法了。如果你有兴趣研究这个问题,可以深入的去研究。
参考文献:
[1] https://geek-docs.com/python/python-examples/python-stack-lifo.html
[2] https://www.bilibili.com/video/BV1AF411w78g/?spm_id_from=333.337.search-card.all.click&vd_source=526e290f96fb270fa1914cdc0f0b1c73