Leetcode刷题(第20题)——有效的括号

x33g5p2x  于2022-02-28 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(286)

一、题目

  1. 给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。
  2. 有效字符串需满足:
  3. 1、左括号必须用相同类型的右括号闭合。
  4. 2、左括号必须以正确的顺序闭合。

二、示例

  1. 示例 1
  2. 输入:s = "()"
  3. 输出:true
  4. 示例2
  5. 输入:s = "()[]{}"
  6. 输出:true
  7. 示例3
  8. 输入:s = "(]"
  9. 输出:false

三、解题思路
本题采用的解题方法是使用栈数据结构,如果遇到{,[,(的话,则入栈,如果遇到),},]的话,则出栈比较,判断是否是左右括号。
四、代码
方法一

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isValid = function(s) {
  6. let array = []
  7. for(let i = 0; i < s.length; i++) {
  8. if(s[i] === "(" || s[i] === "{" || s[i] === "[") {
  9. array.push(s[i])
  10. }else {
  11. let cur = array.pop()
  12. if(cur === "(" && s[i] === ")" ||
  13. cur === "[" && s[i] === "]" ||
  14. cur === "{" && s[i] === "}") {
  15. continue
  16. }else {
  17. return false
  18. }
  19. }
  20. }
  21. return array.length === 0
  22. };

上述代码我们使用判断,导致代码很冗余。此时我们可以使用map来保存{ },(), []之间的关系。
具体代码如下图所示。

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isValid = function(s) {
  6. let array = []
  7. let map = new Map()
  8. map.set("(", ")")
  9. map.set("{", "}")
  10. map.set("[", "]")
  11. for(let i = 0; i < s.length; i++) {
  12. if(map.has(s[i])) {
  13. array.push(s[i])
  14. }else {
  15. if(map.get(array.pop()) === s[i]) {
  16. continue
  17. }else {
  18. return false
  19. }
  20. }
  21. }
  22. return array.length === 0
  23. };

五、结果

时间复杂度为O(n),空间复杂度为O(n)。

相关文章