1. 题目背景与核心需求
LeetCode 135题组合了"有效的括号"和"简化路径"两个经典算法问题,这类题目在面试中出现的频率极高。作为数据结构与算法的基础题型,它们分别考察了栈(stack)的应用和字符串处理能力。
在实际工程中,括号匹配是编译器解析代码、JSON/XML解析器验证文档结构的基础操作;而路径简化则是操作系统处理文件路径、Web服务器解析URL时的常见需求。掌握这两个问题的解法,不仅能帮助通过技术面试,更能提升日常开发中的问题解决能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 有效的括号问题解析
2.1 问题描述与示例
给定一个只包含 '(', ')', '{', '}', '[' 和 ']' 的字符串s,判断字符串是否有效。有效需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
- 每个右括号都有一个对应的相同类型的左括号
示例:
- 输入:"()" → 输出:true
- 输入:"()[]{}" → 输出:true
- 输入:"(]" → 输出:false
- 输入:"([)]" → 输出:false
2.2 栈的经典应用
这个问题是栈数据结构的教科书级案例。解题思路非常直观:
- 初始化一个空栈
- 遍历字符串中的每个字符:
- 遇到左括号就压栈
- 遇到右括号就检查栈顶元素是否匹配
- 最后检查栈是否为空
python复制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 stack
2.3 边界条件与优化
实际编码时需要注意几个关键点:
- 空字符串应该返回true
- 字符串长度为奇数可以直接返回false
- 栈操作前要检查是否为空,避免pop空栈
- 可以使用字典来维护括号映射关系,提高代码可读性
时间复杂度:O(n),空间复杂度:O(n)
3. 简化路径问题深入
3.1 问题描述与示例
给定一个Unix风格的绝对路径,将其简化为规范路径。规范路径要求:
- 以单个斜杠'/'开头
- 两个目录名之间必须只有一个斜杠'/'
- 不能以'/'结尾(除非是根目录)
- 不能包含'.'或'..'
示例:
- 输入:"/home/" → 输出:"/home"
- 输入:"/../" → 输出:"/"
- 输入:"/home//foo/" → 输出:"/home/foo"
- 输入:"/a/./b/../../c/" → 输出:"/c"
3.2 栈的另一种应用
虽然看起来与括号问题不同,但简化路径同样可以使用栈来解决:
- 按'/'分割路径字符串
- 遍历分割后的每个部分:
- 遇到空字符串或'.'则跳过
- 遇到'..'则弹出栈顶元素(如果栈非空)
- 其他情况压栈
- 最后从栈底到栈顶用'/'连接
python复制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.3 实际开发中的注意事项
在真实项目处理路径时,还需要考虑:
- 不同操作系统的路径分隔符差异(Windows用'')
- 相对路径的处理
- 符号链接(symlink)的解析
- 路径中可能包含的特殊字符
Unix系统的路径处理函数通常会自动处理这些问题,但在算法题中需要手动实现。
4. 两种问题的对比与关联
4.1 栈的不同使用模式
虽然都使用栈,但两种问题的处理方式有显著差异:
- 括号匹配:遇到右括号必须立即匹配最近的左括号
- 路径简化:'..'可以延迟处理,直到所有路径部分都被扫描
4.2 字符串处理的技巧
两种问题都涉及字符串处理的关键技巧:
- 字符串分割(split)
- 条件判断与过滤
- 数据结构的选择(栈)
- 边界条件的处理
4.3 面试中的变种问题
面试官可能会基于这两个问题提出变种:
- 支持更多括号类型(如HTML标签)
- 处理相对路径
- 添加路径合法性检查
- 多步操作的组合问题
5. 解题的进阶思考
5.1 空间复杂度优化
对于括号问题,如果字符串非常大,可以考虑:
- 提前检查字符串长度是否为偶数
- 使用计数器替代栈(仅适用于单一括号类型)
对于路径问题,可以:
- 原地修改字符串(但Python字符串不可变)
- 使用双指针法处理
5.2 测试用例设计
全面的测试用例应该包括:
- 空输入
- 最小有效输入
- 嵌套最深的输入
- 包含各种边界条件的组合
- 非法输入(如不匹配的括号)
5.3 实际工程应用
在真实项目中,这类算法常用于:
- 配置文件解析
- URL路由处理
- 模板引擎实现
- 代码静态分析工具
掌握这些基础算法能帮助开发者更好地理解和设计更复杂的系统。
