LeetCode 2267. 检查是否有合法括号字符串路径(BFS)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

一个括号字符串是一个 非空 且只包含 '('')' 的字符串。
如果下面 任意 条件为 真 ,那么这个括号字符串就是 合法的 。

  • 字符串是 ()
  • 字符串可以表示为 AB(A 连接 B),A 和 B 都是合法括号序列。
  • 字符串可以表示为 (A) ,其中 A 是合法括号序列。

给你一个 m x n 的括号网格图矩阵 grid 。
网格图中一个 合法括号路径 是满足以下所有条件的一条路径:

  • 路径开始于左上角格子 (0, 0)
  • 路径结束于右下角格子 (m - 1, n - 1)
  • 路径每次只会向 或者向 移动。
  • 路径经过的格子组成的括号字符串是 合法 的。

如果网格图中存在一条 合法括号路径 ,请返回 true ,否则返回 false 。

示例 1:
输入:grid = [["(","(","("],[")","(",")"],["(","(",")"],["(","(",")"]]
输出:true
解释:上图展示了两条路径,它们都是合法括号字符串路径。
第一条路径得到的合法字符串是 "()(())" 。
第二条路径得到的合法字符串是 "((()))" 。
注意可能有其他的合法括号字符串路径。示例 2:
输入:grid = [[")",")"],["(","("]]
输出:false
解释:两条可行路径分别得到 "))("")((" 。由于它们都不是合法括号字符串,我们返回 false 。提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 100
grid[i][j] 要么是 '(' ,要么是 ')'

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/check-if-there-is-a-valid-parentheses-string-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 使用队列进行广度优先搜索
  • 队列里存储 { 待配对的左括号个数,位置信息x, y },将3个值编码成一个 int
class Solution {
public:bool hasValidPath(vector<vector<char>>& grid) {int dd = 128*128, d = 128, m = grid.size(), n = grid[0].size();if(grid[0][0]!='(' || grid[m-1][n-1]!=')') return false;vector<vector<int>> dir = {{0, 1}, {1, 0}};queue<int> q;unordered_set<int> vis;q.push(dd);  // 起点的编码:左括号个数*128*128 + x*128 + yvis.insert(dd);while(!q.empty()){auto tp = q.front();q.pop();int left = tp/dd;int x = tp%dd/d, y = tp%d;if(x==m-1 && y==n-1 && left==0) return true;for(int k = 0; k < 2; ++k){int nx = x + dir[k][0], ny = y + dir[k][1];if(nx>=0 && nx<m && ny>=0 && ny<n){if(grid[nx][ny]=='('){int hash = (left+1)*dd+(nx*d+ny);if(!vis.count(hash) && left+1 <= (m-1-nx+n-1-ny)){q.push(hash);vis.insert(hash);}}else{if(left-1 < 0)  // 不能配对continue;int hash = (left-1)*dd+(nx*d+ny);if(!vis.count(hash) && left-1 <= (m-1-nx+n-1-ny)){q.push(hash);vis.insert(hash);}}}}}return false;}
};

1556 ms 282.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

python网络爬虫系列(三)——cookie的原理、保存与加载

一、什么是cookie&#xff1f; 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当…

LeetCode 2266. 统计打字方案数(动态规划)

文章目录1. 题目2. 解题1. 题目 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i 次&#xff0c;i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 s &#xff0c;Alice 需要按 7 四…

大学毕业4年-回顾和总结(2)-钱,收入和支出

过年回家&#xff0c;长辈最喜欢问两件事。第一件事&#xff0c;谈朋友没有啊。第二件事&#xff0c;现在一个月搞多少钱。 如果你和他们说&#xff0c;一个月工资是1万&#xff0c;那么他们立刻认为&#xff0c;你现在手上应该有十多万了。 上班族听了&#xff0c;心里…

python网络爬虫系列(四)——requests模块

requests模块 知识点&#xff1a; 掌握 headers参数的使用掌握 发送带参数的请求掌握 headers中携带cookie掌握 cookies参数的使用掌握 cookieJar的转换方法掌握 超时参数timeout的使用掌握 代理ip参数proxies的使用掌握 使用verify参数忽略CA证书掌握 requests模块发送post请…

PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)

文章目录1. 窗口绘图类1.1 QPainter绘制文字绘制点1.2 QPen1.3 QBrush1.4 QPixmap2. 拖拽与剪贴板2.1 拖拽2.2 剪贴板 QClipboard3. 日历与时间3.1 QCalendar3.2 QDateTimeEdit4. 菜单栏、工具栏、状态栏4.1 菜单栏 QMenuBar4.2 工具栏 QToolBar4.3 状态栏 QStatusBar5. QPrint…

python网络爬虫系列(0)——爬虫概述 http协议复习

一、爬虫概述 知识点&#xff1a; 了解 爬虫的概念 了解 爬虫的作用 了解 爬虫的分类 掌握 爬虫的流程 1. 爬虫的概念 模拟浏览器&#xff0c;发送请求&#xff0c;获取响应 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟客户端(主要指…

使用TFHpple解析html

https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 All) 将从github上下载的源码包拖入工程当中 准备工作结束 使用详情 我们来解析网址 http://www.cnblogs.com/YouXianMing/ 中的title标签哦. 思路是这样子的:…

LeetCode 2269. 找到一个数字的 K 美丽值

文章目录1. 题目2. 解题1. 题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目&#xff1a; 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k &#xff0c;请你返回 num 的 k 美丽值。 注意&#xff1a; 允许有 前缀 0 。 0 不能整除任…

LeetCode 2270. 分割数组的方案数(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真&#xff0c;那么 nums 在下标 i 处有一个 合法的分割 &#xff1a; 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素&#xff…

python网络爬虫系列(五)——数据提取 jsonpath模块

一、数据提取概述 知识点 了解 响应内容的分类了解 xml和html的区别 1. 响应内容的分类 在发送请求获取响应之后&#xff0c;可能存在多种不同类型的响应内容&#xff1b;而且很多时候&#xff0c;我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串 可以使用re、…

LeetCode 2271. 毯子覆盖的最多白色砖块数(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表示可以放在 任何位置 的一块毯子。 请你返回…

Nimbus三Storm源码分析--Nimbus启动过程

Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype"-server", 最终调用"backtype.storm.daemon.nimbus"的mainnimbus是用clojure实现的, 但是clojure是基于JVM的, 所以在最终发布…

python网络爬虫系列(六)——数据提取 lxml模块

一、数据提取-lxml模块 知识点 了解 lxml模块和xpath语法的关系了解 lxml模块的使用场景了解 lxml模块的安装了解 谷歌浏览器xpath helper插件的安装和使用掌握 xpath语法-基础节点选择语法掌握 xpath语法-节点修饰语法掌握 xpath语法-其他常用语法掌握 lxml模块中使用xpath语…

LeetCode 2273. 移除字母异位词后的结果数组

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 words &#xff0c;其中 words[i] 由小写英文字符组成。 在一步操作中&#xff0c;需要选出任一下标 i &#xff0c;从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件&#xff1a; 0 < i …

python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

一、selenium的介绍 知识点&#xff1a; 了解 selenium的工作原理了解 selenium以及chromedriver的安装掌握 标签对象click点击以及send_keys输入 1. selenium运行效果展示 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Seleniu…

LeetCode 2274. 不含特殊楼层的最大连续楼层数

文章目录1. 题目2. 解题1. 题目 Alice 管理着一家公司&#xff0c;并租用大楼的部分楼层作为办公空间。 Alice 决定将一些楼层作为 特殊楼层 &#xff0c;仅用于放松。 给你两个整数 bottom 和 top &#xff0c;表示 Alice 租用了从 bottom 到 top&#xff08;含 bottom 和 t…

python网络爬虫系列(八)——常见的反爬手段和解决方法

常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因了解 服务器常反什么样的爬虫了解 反爬虫领域常见的一些概念了解 反爬的三个方向了解 常见基于身份识别进行反爬了解 常见基于爬虫行为进行反爬了解 常见基于数据加密进行反爬 1 服务器反爬的原因 爬虫占总PV(PV是指…

LeetCode 2275. 按位与结果大于零的最长组合(位运算)

文章目录1. 题目2. 解题1. 题目 对数组 nums 执行 按位与 相当于对数组 nums 中的所有整数执行 按位与 。 例如&#xff0c;对 nums [1, 5, 3] 来说&#xff0c;按位与等于 1 & 5 & 3 1 。同样&#xff0c;对 nums [7] 而言&#xff0c;按位与等于 7 。 给你一个…

python网络爬虫系列(九)——打码平台的使用

验证码处理 学习目标 了解 验证码的相关知识掌握 图片识别引擎的使用了解 常见的打码平台掌握 通过打码平台处理验证码的方法 1.图片验证码 1.1 什么是图片验证码 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers an…

LeetCode 2278. 字母在字符串中的百分比

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个字符 letter &#xff0c;返回在 s 中等于 letter 字符所占的 百分比 &#xff0c;向下取整到最接近的百分比。 示例 1&#xff1a; 输入&#xff1a;s "foobar", letter "o" 输出&#xff1a;3…