一、LeetCode 20. 有效的括号
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
1、栈
代码
class Solution {
public:
bool isValid(string s) {
int size = s.size();
// 如果字符串 s 的大小不是偶数,返回 false,因为有效的括号序列中括号的数量必须是偶数
if (size % 2 != 0) return false;
// 定义一个无序映射 pairs,存储括号对的字符及其配对字符
// 无序映射是 C++11 中引入的一种关联容器,它允许我们存储任意类型的键值对,并能够以接近常数时间复杂度的速度进行查找和插入操作
unordered_map<char,char> pairs = {
{')', '('}, // 右括号 ')' 和左括号 '(' 是配对字符
{']', '['}, // 右括号 ']' 和左括号 '[' 是配对字符
{'}', '{'} // 右括号 '}' 和左括号 '{' 是配对字符
};
// 创建一个空的栈 stk,用于存储输入字符串中的字符
stack<char> stk;
// 使用 for 循环遍历输入字符串 s 中的每个字符 ch
for (char ch : s) {
// 如果 ch 是括号对的字符,说明它是右括号
if (pairs.count(ch)) {
// 检查栈 stk 是否为空,或者栈顶元素是否不等于 ch 的配对字符
// 如果满足上述条件之一,则返回 false,说明括号序列无效
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
// 如果括号匹配成功,将栈顶元素弹出
stk.pop();
} else {
// 如果 ch 不是括号对的字符,说明它是左括号,将其压入栈中
stk.push(ch);
}
}
// 最后检查栈 stk 是否为空,如果为空,说明所有括号都正确匹配,返回 true;否则返回 false
return stk.empty();
}
};
复杂度分析
- 时间复杂度: O(n)
- 空间复杂度: O(n)
二、LeetCode 1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:
1、栈
代码
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
// 遍历输入字符串s中的每一个字符
for (char c : s) {
// 检查栈是否为空,并且栈顶的字符是否与当前字符相同
if (!st.empty() && st.top() == c) {
// 如果满足条件,则弹出栈顶的字符,即删除重复的字符
st.pop();
} else {
// 如果不满足条件,则将当前字符压入栈中
st.push(c);
}
}
// 定义一个字符串变量result,用于保存最终的结果
string result;
// 在栈不为空的情况下,进行循环
while (!st.empty()) {
// 将栈顶的字符与结果字符串的前缀拼接,并更新结果字符串
result = st.top() + result;
// 弹出栈顶的字符
st.pop();
}
// 返回最终的结果字符串
return result;
}
};
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
2、用字符串模拟栈
代码
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (char ch : s) {
// 检查 result 是否为空,并且 result 的最后一个字符是否与当前字符ch相同
// 如果满足条件,说明 result 的最后一个字符与当前字符相同,那么就删除 result 的最后一个字符
// 否则,就将当前字符 ch 添加到 result 中
if (result.empty() || ch != result.back()) {
result.push_back(ch); // 如果不满足条件,说明 result 的最后一个字符与当前字符不同,那么就将当前字符 ch 添加到 result 中
} else {
result.pop_back(); // 如果满足条件,说明 result 的最后一个字符与当前字符相同,那么就删除 result 的最后一个字符
}
}
// 返回处理后的字符串 result
return result;
}
};
复杂度分析
- 时间复杂度: O(n)
- 空间复杂度: O(1),返回值不计空间复杂度
三、LeetCode 150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解: