题解 | 有效括号序列
有效括号序列
https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2?tpId=295&tqId=23268&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
stack<char> st;
unordered_map<char, char> mapping = {
{')', '('},
{']', '['},
{'}', '{'}
};
for (char c : s) {
// 如果是闭括号
if (mapping.find(c) != mapping.end()) {
// 如果栈为空,用特殊字符表示
char top_element = st.empty() ? '#' : st.top();
// 如果栈顶元素不匹配当前闭括号对应的开括号
if (top_element != mapping[c]) {
return false;
}
// 匹配成功,弹出栈顶元素
st.pop();
} else {
// 如果是开括号,压入栈中
st.push(c);
}
}
// 最后检查栈是否为空
return st.empty();
}
};
为了解决这个问题,我们需要判断给定的括号字符串是否有效。有效的括号字符串必须满足以下条件: 每个开括号必须有对应的闭括号。 括号必须正确嵌套,即闭括号必须按顺序匹配最近的开括号。 方法思路 栈的使用:利用栈的后进先出(LIFO)特性来匹配括号。遍历字符串时,遇到开括号就压入栈中,遇到闭括号则检查栈顶元素是否与之匹配。 提前终止:如果遇到闭括号时栈为空或栈顶元素不匹配,可以立即返回false,因为这意味着括号不按正确顺序闭合。 最终检查:遍历完字符串后,如果栈为空,说明所有括号都正确匹配,返回true;否则返回false。 代码解释 初始化:创建一个空栈和一个字典mapping,用于存储闭括号到开括号的映射。 遍历字符:对于字符串中的每个字符: 如果是闭括号,检查栈顶元素是否匹配。若栈为空或栈顶元素不匹配,返回false。 如果是开括号,压入栈中。 最终检查:遍历结束后,栈为空则返回true,否则返回false。 这种方法确保在O(n)时间内解决问题,其中n是字符串的长度,空间复杂度为O(n)用于栈的存储。
栈/堆/队列 文章被收录于专栏
操作只能在栈顶进行 栈应用场景 函数调用栈 浏览器前进后退 括号匹配检查 表达式求值 变种队列 双端队列 (Deque):两端都可以入队和出队 优先队列 (Priority Queue):按优先级出队 循环队列:固定大小的循环使用空间 队列应用场景 消息队列 任务调度 广度优先搜索 打印任务队列 堆应用场景 优先队列实现 堆排序 Top K 问题 定时任务调度
查看10道真题和解析
