欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > C++算法练习-day23——20.有效的括号

C++算法练习-day23——20.有效的括号

2024/10/27 16:47:38 来源:https://blog.csdn.net/L613Z/article/details/142964334  浏览:    关键词:C++算法练习-day23——20.有效的括号

题目来源:. - 力扣(LeetCode)

题目思路分析

题目是关于验证括号字符串是否有效的经典问题。一个括号字符串是有效的,当且仅当它满足以下条件:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

例如,字符串 "()" 和 "()[]{}" 是有效的,而 "(]" 和 "(()" 则不是有效的括号字符串。

解题思路:

  • 使用栈(Stack)数据结构来处理括号匹配问题。
  • 遍历字符串中的每个字符:
    • 如果遇到左括号('(', '[', '{'),将其压入栈中。
    • 如果遇到右括号(')', ']', '}'),检查栈顶元素是否为对应的左括号,如果是,则弹出栈顶元素,否则字符串无效。
  • 最后,如果栈为空,说明所有的括号都成功匹配,字符串有效;否则,字符串无效。

代码:

#include <iostream>  
#include <stack>  
#include <unordered_map>  
#include <string>  using namespace std;  class Solution {  
public:  bool isValid(string s) {  int n = s.size();  // 如果字符串长度为奇数,直接返回false,因为无法匹配  if (n % 2 == 1) {  return false;  }  // 创建一个哈希表,存储右括号到左括号的映射  unordered_map<char, char> pairs = {{'}', '{'}, {']', '['}, {')', '('}};  stack<char> stk;  // 遍历字符串中的每个字符  for (char e : s) {  // 如果当前字符是右括号  if (pairs.count(e)) {  // 如果栈为空,或者栈顶元素不是对应的左括号,则字符串无效  if (stk.empty() || stk.top() != pairs[e]) {  return false;  }  // 弹出栈顶元素,表示成功匹配了一对括号  stk.pop();  } else {  // 如果是左括号,则压入栈中  stk.push(e);  }  }  // 如果栈为空,说明所有括号都成功匹配,返回true  // 否则,返回false,表示有未匹配的左括号  return stk.empty();  }  
};  

注释详解

  • unordered_map<char, char> pairs = {{'}', '{'}, {']', '['}, {')', '('}};:创建一个哈希表,用于存储右括号到左括号的映射。
  • stack<char> stk;:创建一个栈,用于存储遍历过程中遇到的左括号。
  • if (n % 2 == 1) { return false; }:如果字符串长度为奇数,直接返回false,因为无法匹配。
  • if (pairs.count(e)) { ... } else { ... }:判断当前字符是否为右括号,如果是则检查栈顶元素,否则将左括号压入栈中。
  • if (stk.empty() || stk.top() != pairs[e]) { return false; }:如果栈为空,或者栈顶元素不是对应的左括号,则返回false。
  • stk.pop();:弹出栈顶元素,表示成功匹配了一对括号。
  • return stk.empty();:最后检查栈是否为空,如果为空则返回true,否则返回false。

知识点摘要

  • 栈(Stack)数据结构:后进先出(LIFO)的数据结构,常用于解决括号匹配等问题。
  • 哈希表(Hash Table):一种高效的键值对存储结构,支持快速查找。
  • 字符串遍历:使用范围for循环(range-based for loop)遍历字符串中的每个字符。

通过这道题,我们学习了如何使用栈数据结构来解决括号匹配问题。这种方法不仅简单易懂,而且非常高效。在实际应用中,栈和哈希表等数据结构是解决问题的有力工具,掌握它们可以大大提高我们的编程能力和解决问题的能力。希望这篇文章能帮助大家更好地理解这个问题,并学会使用栈和哈希表来解决类似的问题。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com