20_有效的括号

news/2024/9/20 14:03:50/文章来源:https://www.cnblogs.com/zeta186012/p/18422388

20_有效的括号

【问题描述】

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
示例一:
输入:s = "()"
输出:true示例二:
输入:s = "()[]{}"
输出:true示例三:
输入:s = "(]"
输出:false示例四:
输入:s = "([])"
输出:true

提示:

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

【算法设计思想】

在解决本题时,我们要使用一种类似于键值对的数据结构,要确保左右括号的对应关系。在Python中我们可以直接使用内置的字典数据类型,在Java中我们可以使用HashMap类,在C++中我们可以使用STL中的unordered_map来实现,在什么都没有的C语言中我们可以直接自己定义一个pairs函数用来实现这种对应关系。然后我们依次遍历给定的字符串s,如果碰到了左括号,那么我们把它加入到栈中,如果碰到了右括号,那么我们调用这种对应关系,然后判断栈顶的元素和其是否匹配,如果匹配,那么我们继续遍历,只要有一个不匹配,那么我们直接返回false即可。最后我们看一下栈是否为空,即可得出结论。

注意:

  • Java中和C++中各种数据结构的调用

【算法描述】

Python:

class Solution:def isValid(self, s: str) -> bool:# 定义括号对应关系的字典,右括号为键,左括号为值brackets = {')': '(', ']': '[', '}': '{'}# 初始化一个空栈,用于存放左括号stack = []# 遍历字符串中的每个字符for char in s:# 如果字符是左括号,将其压入栈中if char in brackets.values():stack.append(char)# 如果字符是右括号,检查匹配情况elif char in brackets:# 当栈为空或栈顶元素不匹配当前右括号时,返回Falseif not stack or brackets[char] != stack[-1]:return False# 如果栈顶元素匹配当前右括号,弹出栈顶元素stack.pop()# 遍历结束后,检查栈是否为空# 如果栈为空,说明所有括号成功匹配;否则返回Falsereturn not stack

C++:

class Solution {
public:bool isValid(const std::string& s) {// 定义括号对应关系的 unordered_map,右括号为键,左括号为值std::unordered_map<char, char> brackets = {{')', '('},  // 右括号 ')' 对应左括号 '('{']', '['},  // 右括号 ']' 对应左括号 '['{'}', '{'}   // 右括号 '}' 对应左括号 '{'};// 初始化一个空栈,用于存放左括号std::stack<char> stack;// 遍历字符串中的每个字符for (char elem : s) {// 如果字符是左括号,将其压入栈中if (elem == '(' || elem == '[' || elem == '{') {stack.push(elem);}// 如果字符是右括号,检查匹配情况else if (brackets.count(elem)) {// 当栈为空或栈顶元素不匹配当前右括号时,返回 falseif (stack.empty() || stack.top() != brackets[elem]) {return false;}// 如果栈顶元素匹配当前右括号,弹出栈顶元素stack.pop();}// 如果字符既不是左括号也不是右括号,返回 false(可以选择忽略或处理非法字符)else {return false;}}// 遍历结束后,检查栈是否为空// 如果栈为空,说明所有括号成功匹配;否则返回 falsereturn stack.empty();}
};

Java:

class Solution {public boolean isValid(String s) {// 获取字符串的长度int n = s.length();// 如果长度是奇数,括号不可能成对匹配,直接返回 falseif (n % 2 == 1) {return false;}// 定义一个 HashMap 来存储括号的配对关系// 右括号为键,左括号为值Map<Character, Character> pairs = new HashMap<Character, Character>() {{put(')', '(');  // 右括号 ')' 对应左括号 '('put('}', '{');  // 右括号 '}' 对应左括号 '{'put(']', '[');  // 右括号 ']' 对应左括号 '['}};// 初始化一个空栈,用于存放左括号Deque<Character> stack = new LinkedList<Character>();// 遍历字符串中的每个字符for (int i = 0; i < n; i++) {char ch = s.charAt(i);// 如果字符是右括号,检查是否有匹配的左括号if (pairs.containsKey(ch)) {// 如果栈为空,或栈顶的左括号不匹配当前的右括号,返回 falseif (stack.isEmpty() || stack.peek() != pairs.get(ch)) {return false;}// 如果栈顶元素匹配当前右括号,弹出栈顶元素stack.pop();} // 如果字符是左括号,将其压入栈中else {stack.push(ch);}}// 遍历结束后,检查栈是否为空// 如果栈为空,说明所有的括号都成功匹配;否则返回 falsereturn stack.isEmpty();}
}

C:

/*** 根据给定的右括号字符返回对应的左括号字符。* @param ch 一个右括号字符。* @return 对应的左括号字符,如果不存在则返回0。*/
char pairs(char ch)
{if (ch == ')')return '(';if (ch == ']')return '[';if (ch == '}')return '{';return 0;
}/*** 检查给定的字符串中的括号是否正确匹配。* @param s 包含括号的字符串。* @return 如果括号正确匹配,则返回true;否则返回false。*/
bool isValid(char *s)
{int n = strlen(s);// 如果字符串长度为奇数,则括号无法完全匹配if (n % 2 == 1){return 0;}char stack[n + 1];int top = 0;for (int i = 0; i < n; i++){char ch = pairs(s[i]);if (ch){// 如果当前字符是右括号,检查它是否与栈顶的左括号匹配if (top == 0 || stack[top - 1] != ch){return 0;}top--;}else{// 如果当前字符是左括号,将其压入栈顶stack[top++] = s[i];}}// 如果栈为空,说明所有括号都正确匹配return top == 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800511.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea新版ui调出前进/后退箭头

查看源码或者查看类/方法定义,需要前进或者后退 Jetbrains IDE新UI设置前进/后退导航键_idea设置前进后退-CSDN博客

气象数据

GDAS(Global Data Assimilation System)全球数据同化系统,是美国国家气象局(National Weather Service, NWS)的一部分,它是一个复杂的系统,用于生成全球范围的气象分析数据。 1.FNL大气再分析数据集 是GDAS的最终分析产品,用于历史和气候研究 更新慢 1度的 https://rda…

中电信翼康基于Apache Dolphinscheduler重构“星海济世医疗数据中台”实践经验分享

文章作者:尚志忠 编辑整理:曾辉 行业背景 随着大数据、云计算、5G、人工智能等技术的快速发展,以及医疗信息化建设的不断深入,数据中台作为打通医疗数据融合壁垒、实现数据互通与共享、构建高效数据应用的关键信息平台,正逐渐成为推动医疗行业数字化转型和创新发展的重要力…

ESXi 8.0 中已弃用且不受支持的设备 (88172)

ESXi 8.0 中已弃用且不受支持的设备 (88172)ESXi 8.0 中已弃用且不受支持的设备 (88172) 请访问原文链接:ESXi 8.0 中已弃用且不受支持的设备 (88172),查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org该文为官方 KB 的翻译和整理,方便查询 ESXi 8.0 中不再支持…

帝国cms建立目录不成功!请检查目录权限

当帝国CMS提示“建立目录不成功!请检查目录权限”时,通常是因为帝国CMS在尝试生成静态页面或执行其他文件操作时,遇到了文件系统权限问题。以下是一些解决此问题的步骤: 常见原因及解决办法目录权限不足:解决办法:确保目标目录具有可写的权限。通常,文件权限应设为 644,…

帝国CMS:恢复备份文件刷新时出错——建立目录不成功

当帝国CMS在恢复备份文件刷新时提示“建立目录不成功”,这通常意味着在生成静态页面或存放相关文件的过程中遇到了问题。以下是一些可能的原因及其解决办法: 常见原因及解决办法目录权限问题:解决办法:检查目标目录的权限是否正确。通常文件权限应设为 644,目录权限为 755…

帝国CMS 建立目录不成功!

帝国CMS在尝试建立目录时提示“建立目录不成功”,通常是因为权限问题或其他与文件系统相关的障碍。以下是一些可能的原因及解决方法: 常见原因及解决方法目录权限不足:解决方法:确保目标目录具有可写的权限。通常,文件权限应设为 644,目录权限为 755。可以通过FTP客户端或…

帝国CMS提示parse error syntax error的解决方法

当帝国CMS提示“Parse error: syntax error”时,这通常意味着PHP解析器遇到了无法理解的代码,最常见的原因是语法错误。以下是一些解决此类问题的方法: 常见原因及解决办法检查语法错误:解决办法:仔细检查报错行附近的代码,查找是否有语法错误,如缺少分号、括号不匹配、…

帝国CMS提示parse error syntax error的解决方法

当帝国CMS提示“Parse error: syntax error”时,这通常意味着PHP解析器遇到了无法理解的代码,最常见的原因是语法错误。以下是一些解决此类问题的方法: 常见原因及解决办法检查语法错误:解决办法:仔细检查报错行附近的代码,查找是否有语法错误,如缺少分号、括号不匹配、…

香橙派5Pro+虚拟机Ubuntu18.04交叉编译+Opencv4.7

1.基础工具安装 ①Ubuntu虚拟机下交叉编译工具链安装 香橙派5Pro为Arm64位架构,因此需要安装g++-aarch64-linux-gnu以及gcc-aarch64-linux-gnu(有其它交叉编译器,本文以此编译器为例)更新软件源 sudo apt update sudo apt upgrate点击查看交叉编译工具链安装 apt-cache sea…

周五学习 -2024/9/20

今天9月20日,出发去徐州! HashMap HashMap的特点HashMap底层是哈希表结构的 依赖hashCode方法和equals方法保证键的唯一 如果键存储的是自定义对象,需要重写hashCode和equals方法DQL-分页查询 SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数; 注意:起始索引从0开始,起始…

帝国cms首页不显示怎么办

帝国CMS首页不显示的问题可能由多种原因引起。以下是一些常见的排查步骤和解决方法: 排查步骤确认运行环境:检查帝国CMS是否已正确安装并配置。 确保已安装所有必需的模块,并且PHP版本满足要求。检查.htaccess文件:如果你的网站托管在Apache服务器上,检查.htaccess文件是否…