LeetCode栈应用:有效括号与路径简化解析 1. 题目解析与核心思路这两道LeetCode经典题目虽然看似简单但包含了字符串处理和栈应用的典型场景。我们先分别拆解题目要求1.1 有效的括号LeetCode 20给定一个只包含 (, ), {, }, [ 和 ] 的字符串判断字符串是否有效。有效需满足左括号必须用相同类型的右括号闭合左括号必须以正确的顺序闭合每个右括号都有一个对应的相同类型的左括号1.2 简化路径LeetCode 71给定一个Unix风格的绝对路径将其简化为规范路径。规范路径需满足路径以单个斜杠 / 开头两个目录名之间必须只有一个斜杠 /不能以 / 结尾除非是根目录需要处理 .当前目录和 ..上级目录2. 有效的括号解法详解2.1 栈的应用原理这是典型的栈应用场景因为括号匹配具有后进先出的特性遇到左括号时压栈遇到右括号时检查栈顶是否匹配最终栈应为空def isValid(s: str) - bool: stack [] mapping {): (, }: {, ]: [} for char in s: if char in mapping: # 右括号 top_element stack.pop() if stack else # if mapping[char] ! top_element: return False else: # 左括号 stack.append(char) return not stack2.2 边界条件处理实际编码时需要注意空字符串应返回True单独左括号或右括号的情况括号数量不匹配的情况括号类型交叉的情况如([)]提示使用字典存储括号映射关系可以简化代码避免多层if-else判断3. 简化路径的多种解法3.1 栈解法推荐Unix路径规范化的核心是处理.和..遇到正常目录名压栈遇到.跳过遇到..弹出栈顶元素def simplifyPath(path: str) - str: stack [] for part in path.split(/): if part ..: if stack: stack.pop() elif part and part ! .: stack.append(part) return / /.join(stack)3.2 时间复杂度分析两种解法的时间复杂度均为O(n)因为每个字符只处理一次栈操作都是O(1)时间最终字符串拼接也是O(n)空间复杂度取决于路径深度最坏情况O(n)4. 常见错误与调试技巧4.1 有效的括号常见错误未处理空输入直接访问s[0]导致越界栈操作顺序错误应先检查栈是否为空再pop类型判断遗漏如只处理圆括号忽略其他类型调试时可使用这些测试用例 → True[ → False(] → False([)] → False{[]} → True4.2 简化路径易错点连续斜杠处理split(/)会产生空字符串根目录表示结果应以/开头末尾斜杠除根目录外不应有结尾/多个..连续出现应能正确回退多级关键测试用例/../ → //home//foo/ → /home/foo/a/./b/../../c/ → /c/a/../.././../../ → /5. 进阶优化与变种问题5.1 支持更多括号类型如果需要支持HTML标签等更多符号只需扩展mapping字典mapping { ): (, }: {, ]: [, : , 」: 「 }5.2 带参数的路径简化实际工程中可能需要处理带参数的路径/api/users?id123 → 应保留查询参数解决方案先分离路径和参数再单独处理路径部分5.3 内存优化版本对于超大输入可以用指针代替实际栈操作C示例int isValid(string s) { int top -1; for(int i0;is.length();i){ if(top0 || !isMatch(s[top], s[i])){ top; s[top] s[i]; }else{ --top; } } return top-1; }6. 工程实践中的应用6.1 编译器中的括号匹配现代IDE的语法检查器实时验证括号匹配算法类似但需要记录错误位置支持多语言的不同括号规则与语法树结合处理6.2 文件系统路径处理实际开发中的注意事项跨平台路径分隔符处理Windows用符号链接和真实路径的区分权限检查与路径标准化顺序Python的os.path模块已实现类似功能import os os.path.normpath(/a/b/../c) # /a/c7. 学习路线建议掌握这类问题的通用解法先识别问题是否具有最近相关性特征设计栈的入栈/出栈条件处理边界情况和异常输入考虑时间和空间复杂度优化推荐练习题目LeetCode 394字符串解码LeetCode 84柱状图中最大矩形LeetCode 227基本计算器 II