算法 / 计算机 · 2024年1月10日 0

算法之有效的括号

算法之有效的括号

题目

1 英文:

2.中文

  1. for example

    输出: true 示例 2:

    输入: "()[]{}" 输出: true 示例 3:

    输入: "(]" 输出: false 示例 4:

    输入: "([)]" 输出: false 示例 5:

    输入: "{[]}" 输出: true

思路

对自己要求

  1. 只能接受线性时间复杂度算法
  2. 空间复杂尽量小,代码尽量简洁

思路一

  1. 之前从算法基础一本书看过,关于 "(" ")" 组成有效括号

  2. for example:

  3. 套到这题上面,有3个情况 假设用 3个数做基数 "(" 从1 开始 '[' 从100 开始 "{" 从1000开始

  4. 缺点:可能存在100小括号,加统计,如果超过100 小括号,需要进位,但是,就算可以进位,之前的计算结果怎么处理?所以这个想法只能验证局部

思路二

  1. 遍历字符串 如果碰到左括号拼接字符串,如果碰到右括号的,查看拼接字符串长度 ,遍历后面等长,并且将')' 转换成'('并拼接 ,完成后和左括号的字符串比较
  2. 代码实现:

 

  1. 多次测试发现自己想法有问题: "(([]){})" 这样的字符串,是有效的,但是我的程序,会解析成 无效

学习别人思路

  1. 其实这个是递归问题,可以用递归处理,但是递归效率太低,另外一个方式用广度或者深度枚举,这里觉得 深度比较符合场景(这里不得不批评下自己,学习那么多,广度和深度,这里一直卡在一种思路上面,而且这个思路,还是错误的场景),通过压栈的方式

  2. show code:

  3. 总结:

    1. 其实自己的想法 就是类似手动实现 压栈的操作,但是没有完整栈操作合理
    2. 一个点想不通的,立马换个思路,实践大于理论