博客昵称:沈小农学编程
作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!
PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
题目难度:简单
默认优化目标:最小化时间复杂度。
Python默认为Python3。
目录
[1 题目描述](#1 题目描述)
[2 题目分析](#2 题目分析)
[3 算法框架及代码实现](#3 算法框架及代码实现)
[3.1 栈](#3.1 栈)
1 题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
示例 1:
**输入:**s = "()"
**输出:**true
示例 2:
**输入:**s = "()[]{}"
**输出:**true
示例 3:
**输入:**s = "(]"
**输出:**false
示例 4:
**输入:**s = "([])"
**输出:**true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
2 题目分析
输入是一个字符串数组s,输出是布尔值。判断s是否有效。有效的条件是左右括号类型相同且以正确的方式闭合。
3 算法框架及代码实现
3.1 栈
因为需要判断左右括号类型是否正确,我们可以开一个字典将类型相同的左右括号变成一对。然后从左往右进行对左括号压栈出栈操作,判断与右括号的关系,即:
· 如果是左括号,则添加到栈中;
· 如果是右括号,则检查栈是否为空栈,或栈顶的左括号是否与当前右括号相匹配。匹配诚恐后为true;反之为false。
流程图如下:
时间复杂度,空间复杂度。是字典开辟的空间。
**C++**代码实现
cpp
class Solution {
public:
bool isValid(string s) {
if(s.size()%2==1){
return false;
}
unordered_map<char, char> pairs={
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> st;
for(char ch:s){
if(ch=='(' || ch=='[' || ch=='{') st.push(ch);
else{
if(st.empty() || st.top()!=pairs[ch]) return false;
st.pop();
}
}
return st.empty();
}
};
Python代码实现
python
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
pairs = {
')': '(',
']': '[',
'}': '{'
}
stack = []
for ch in s:
if ch in '([{':
stack.append(ch)
else:
if not stack or stack[-1] != pairs[ch]:
return False
stack.pop()
return not stack