【LeetCode刷题日志】20.有效的括号

雨点打透心脏的1/2处 2024-04-22 04:36 157阅读 0赞

aa51d19831f844e4a87c9a41f570d7f6.png

  • ?个人主页:库库的里昂
  • ?C/C++领域新星创作者
  • ?欢迎 ?点赞✍评论⭐收藏
  • ✨收录专栏:LeetCode 刷题日志
  • ?希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!?

目录

1.题目描述

2.解题思路+代码实现

方法:栈

思路及算法:

代码实现:


1.题目描述

OJ链接 【leetcode 题号:20.有效的括号】【难度:简单】

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

  1. 输入:s = "()"
  2. 输出:true

示例 2:

  1. 输入:s = "()[]{}"
  2. 输出:true

示例 3:

  1. 输入:s = "(]"
  2. 输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

2.解题思路+代码实现

方法:栈
思路及算法:

判断括号的有效性可以使用「栈」这一数据结构来解决。

我们遍历给定的字符串s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。

当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串s无效,返回False。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。

在遍历结束后,如果栈中没有左括号,说明我们将字符串s中的所有左括号闭合,返回True,否则返回False。

注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回False,省去后续的遍历判断过程。

代码实现:
  1. typedef char STDataType;
  2. typedef struct Stack
  3. {
  4. STDataType* a;
  5. int top;
  6. int capacity;
  7. }ST;
  8. void STInit(ST* pst)
  9. {
  10. assert(pst);
  11. pst->a = NULL;
  12. pst->top = 0;
  13. pst->capacity = 0;
  14. }
  15. void STDestroy(ST* pst)
  16. {
  17. assert(pst);
  18. free(pst->a);
  19. pst->a = NULL;
  20. pst->top = 0;
  21. pst->capacity = 0;
  22. }
  23. void STPush(ST* pst,STDataType x)
  24. {
  25. if (pst->top == pst->capacity) {
  26. int newCapacity = pst->capacity == 0 ? 4 :pst-> capacity * 2;
  27. STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));
  28. if (tmp == NULL) {
  29. perror("realloc fail");
  30. return;
  31. }
  32. pst->a = tmp;
  33. pst->capacity = newCapacity;
  34. }
  35. pst->a[pst->top] = x;
  36. pst->top++;
  37. }
  38. bool STEmpty(ST* pst)
  39. {
  40. assert(pst);
  41. return pst->top == 0;
  42. }
  43. void STPop(ST* pst)
  44. {
  45. assert(pst);
  46. assert(!STEmpty(pst));
  47. pst->top--;
  48. }
  49. STDataType STTop(ST* pst)
  50. {
  51. assert(pst);
  52. assert(!STEmpty(pst));
  53. return pst->a[pst->top - 1];
  54. }
  55. int STSize(ST* pst)
  56. {
  57. assert(pst);
  58. return pst->top;
  59. }
  60. bool isValid(char* s) {
  61. ST st;
  62. STInit(&st);
  63. while (*s) {
  64. if (*s == '(' || *s == '[' || *s == '{') {
  65. STPush(&st, *s);
  66. }
  67. else {
  68. if (STEmpty(&st)) {
  69. STDestroy(&st);
  70. return false;
  71. }
  72. char top = STTop(&st);
  73. STPop(&st);
  74. if ((top != '(' && *s == ')') ||
  75. (top != '{' && *s == '}') ||
  76. (top != '[' && *s == ']')) {
  77. STDestroy(&st);
  78. return false;
  79. }
  80. }
  81. s++;
  82. }
  83. bool ret = STEmpty(&st);
  84. STDestroy(&st);
  85. return ret;
  86. }

复杂度分析

  • 时间复杂度:O(n),其中n是字符串 sss 的长度。
  • 空间复杂度:O(n+∣Σ∣),其中 Σ\SigmaΣ 表示字符集,本题中字符串只包含 666 种括号,∣Σ∣=6。栈中的字符数量为 O(n),而哈希表使用的空间为O(∣Σ∣),相加即可得到总空间复杂度。

7ba13d96bef5407c8fae4224089bbd9e.png

发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode20 有效括号

    题目重述 给定一个只包括 ‘(’,’)’,’\{’,’\}’,’\[’,’\]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括

    相关 LeetCode---20. 有效括号

    有效的括号 给定一个只包括 ‘(’,’)’,’\{’,’\}’,’\[’,’\]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭