目录
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
解题思路
配对问题考虑到用栈的方法,栈的特性--同一端输入输出且为后进先出。思路就是让左括号入栈,遇到右括号则判断是否与栈顶配对,配对则出栈,否则返回false。
代码实现
用一个容器存储括号方便访问,这里用的map关联容器,方便访问元素和利用括号间的关系,传入一个字符即可返回对应数字。
栈stack有出栈和入栈两种操作,分别对应pop和push函数。
class Solution {
public:
bool isValid(string s) {
unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},{')',4},{']',5},{'}',6}};
stack<char> st;
for(char c:s){
int a=m[c];//返回与字符c对应的数字
if(a>=1&&a<=3){
st.push(c);//左括号入栈
}
else if(!st.empty() && m[st.top()] == a-3){
st.pop();//括号配对,栈顶出栈
}
else{
return false;
}
}
if(!st.empty()){//考虑到最后只剩左括号,栈不空的情况
return false;
}
return true;//排除所有错误情况,说明字符串有效
}
};
今日知识
在C++中,std::map
是一种关联容器,它提供了一种键-值(key-value)对的存储方式。std::map
基于红黑树(Red-Black Tree)实现,它保持着元素根据键的自动排序。以下是关于 std::map
的一些重要特点和用法:
std::map
中的每个元素由一个键(key)和一个值(value)组成,键和值可以是任意类型。std::map
中的键是唯一的,每个键只能对应一个值。如果向std::map
插入重复的键,则会更新对应的值。std::map
中的元素默认按照键的升序进行排序。也可以通过自定义比较函数来指定排序方式。- 在
std::map
中查找、插入和删除元素的时间复杂度为 O(logN),其中 N 是元素的个数。 std::map
提供了很多成员函数来进行元素的插入、删除、查找和遍历,如insert()
,erase()
,find()
,begin()
,end()
等。std::map
还支持迭代器,可以使用迭代器遍历容器中的元素。- C++11 引入了
std::unordered_map
,也是一种关联容器,使用哈希表实现,可以提供更快的插入、查找和删除操作,但不保证元素的顺序。
总结感悟
一开始没有考虑到最后只剩左括号跳出循环的情况,导致出错,可见考虑的还是不够全面。这就体现了边缘测试的重要性了。