括号匹配——leedcode20
思路:栈的使用
注意:在判断的时候,需要注意什么时候return。
最后执行的输入:“))”
最后执行的输入:“([}}])”
错误样例
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 != 0:
return False
stack = list()
pairs = {
")" : "(",
"}" : "{",
"]" : "["
}
for i in s:
if i in pairs:
if len(stack) != 0:
if pairs[i] == stack[-1]:
stack.pop()
else:
stack.append(i)
return not stack
正确
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 != 0:
return False
stack = list()
pairs = {
")" : "(",
"}" : "{",
"]" : "["
}
for i in s:
if i in pairs:
if len(stack) != 0:
if pairs[i] == stack[-1]:
stack.pop()
else:
return False
else:
return False
else:
stack.append(i)
return not stack
比较好的答案
# 快
class Solution:
def isValid(self, s: str) -> bool:
dic = {")":"(", "}":"{","]":"["}
stack = []
for i in s:
if stack and i in dic:
if stack[-1] == dic[i]:
stack.pop()
else:
return False
else:
stack.append(i)
return not stack
# 内存少
class Solution:
def isValid(self, s: str) -> bool:
dic = {"(": "a", "[": "b", "{": "c", ")": "a", "]": "b", "}": "c"}
lis1 = list(s)
lis2 = [0]
c = d = ""
for i in range(len(lis1)):
if lis1[i] == "(" or lis1[i] == "[" or lis1[i] == "{":
lis2.append(dic[lis1[i]])
else:
c = lis1[i]
d = lis2.pop()
if dic[c] != d:
return False
else:
pass
if lis2 == [0]:
return True
else:
return False
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n % 2 == 1)
return false;
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for(char c : s){
if(pairs.count(c)){
if(stk.empty() || stk.top() != pairs[c]){
return false;
}
stk.pop();
}
else
stk.push(c);
}
return stk.empty();
}
};
学到了
std::unordered_map
是 C++ 标准库中的一个容器,提供了一系列的成员函数以进行插入、删除、查找和遍历等操作。下面是 std::unordered_map
常用的成员函数:
-
插入和删除操作:
insert
: 插入一个键值对或一组键值对。emplace
: 在容器中构造一个对象并插入。erase
: 删除指定键的元素。clear
: 清空容器中的所有元素。
-
查找和访问操作:
find
: 查找指定键的元素,返回一个迭代器。at
: 访问指定键的值,如果键不存在,会抛出std::out_of_range
异常。operator[]
: 通过键访问值,如果键不存在,则会插入新的键值对。count
: 返回指定键在容器中出现的次数。
-
容量相关操作:
empty
: 检查容器是否为空。size
: 返回容器中元素的个数。max_size
: 返回容器可以容纳的最大元素个数。
-
迭代器相关操作:
begin
: 返回指向容器第一个元素的迭代器。end
: 返回指向容器末尾(最后一个元素之后)的迭代器。cbegin
、cend
: 类似于begin
和end
,但返回的是常量迭代器。
除了上述函数之外,std::unordered_map
还提供了其他一些功能,并且继承自其他容器共享的一些函数,比如复制构造、移动构造等。
当然,这里有一个简单的例子来演示 std::unordered_map
的一些常用函数:
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<std::string, int> scores;
// 插入键值对
scores.insert({"Alice", 95});
scores.insert(std::make_pair("Bob", 80));
scores.emplace("Charlie", 75);
// 访问值
std::cout << "Alice's score: " << scores.at("Alice") << std::endl;
std::cout << "Bob's score: " << scores["Bob"] << std::endl;
// 查找键是否存在
if (scores.find("Charlie") != scores.end()) {
std::cout << "Charlie's score: " << scores["Charlie"] << std::endl;
}
// 删除元素
scores.erase("Bob");
// 遍历元素
for (const auto& pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
// 容器大小
std::cout << "Number of entries: " << scores.size() << std::endl;
// 判断是否为空
if (scores.empty()) {
std::cout << "The map is empty." << std::endl;
}
return 0;
}
这个示例中,我们创建了一个 std::unordered_map
对象 scores
,它将学生的姓名映射到他们的分数。我们使用 insert
、emplace
和推导式 {}
等方式插入了一些键值对,然后通过键访问和输出对应的值。
在查找方面,我们使用 find
函数来检查是否存在特定的键,并使用迭代器遍历了容器中的所有元素。
最后,我们删除了一个键为 “Bob” 的元素,并展示了容器的大小和是否为空。
注意,在实际使用时,需要根据具体情况选择合适的数据类型作为键和值,并根据需要处理异常情况和错误处理。