IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 241. 为运算表达式设计优先级 : DFS 运用题 -> 正文阅读

[数据结构与算法]241. 为运算表达式设计优先级 : DFS 运用题

题目描述

这是 LeetCode 上的 241. 为运算表达式设计优先级 ,难度为 中等

Tag : 「DFS」、「爆搜」

给你一个由数字和运算符组成的字符串?expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。

生成的测试用例满足其对应输出值符合 位整数范围,不同结果的数量不超过

示例 1:

输入:expression?=?"2-1-1"

输出:[0,2]

解释:
((2-1)-1)?=?0?
(2-(1-1))?=?2

示例 2:

输入:expression?=?"2*3-4*5"

输出:[-34,-14,-10,-10,10]

解释:
(2*(3-(4*5)))?=?-34?
((2*3)-(4*5))?=?-14?
((2*(3-4))*5)?=?-10?
(2*((3-4)*5))?=?-10?
(((2*3)-4)*5)?=?10

提示:

  • expression 由数字和算符 '+''-''*' 组成。
  • 输入表达式中的所有整数值在范围

DFS

为了方便,我们令 expressions

数据范围为 ,且要统计所有的计算结果,我们可以运用 DFS 爆搜所有方案。

给定的 s 只有数字和运算符,我们可以根据运算符将式子分为左右两部分,设计递归函数 List<Integer> dfs(int l, int r),含义为搜索子串 的所有运算结果。

最终答案为 dfs(0,n-1),其中 为入参字符串的长度,同时我们有显而易见的递归出口:当给定的 不包含任何运算符时,搜索结果为 所代表的数字本身。

考虑如何对任意 进行计算:我们可以通过枚举 范围内的所有的运算符位置来进行爆搜,假设当前枚举到的 为运算符,我们可以递归运算符的左边 dfs(l,i-1) 拿到左边所有的结果,递归运算符右边 dfs(i+1,r) 拿到右边的所有结果,结合「乘法原理」即可知道以当前运算符 为分割点的表达式的所有方案。

不难发现,上述过程都是由「小表达式」的结果推导出「大表达式」的结果,因此也可以运用「区间 DP」方式进行求解,复杂度与 DFS 一致。

代码:

class?Solution?{
????char[]?cs;
????public?List<Integer>?diffWaysToCompute(String?s)?{
????????cs?=?s.toCharArray();
????????return?dfs(0,?cs.length?-?1);
????}
????List<Integer>?dfs(int?l,?int?r)?{
????????List<Integer>?ans?=?new?ArrayList<>();
????????for?(int?i?=?l;?i?<=?r;?i++)?{
????????????if?(cs[i]?>=?'0'?&&?cs[i]?<=?'9')?continue;
????????????List<Integer>?l1?=?dfs(l,?i?-?1),?l2?=?dfs(i?+?1,?r);
????????????for?(int?a?:?l1)?{
????????????????for?(int?b?:?l2)?{
????????????????????int?cur?=?0;
????????????????????if?(cs[i]?==?'+')?cur?=?a?+?b;
????????????????????else?if?(cs[i]?==?'-')?cur?=?a?-?b;
????????????????????else?cur?=?a?*?b;
????????????????????ans.add(cur);
????????????????}
????????????}
????????}
????????if?(ans.isEmpty())?{
????????????int?cur?=?0;
????????????for?(int?i?=?l;?i?<=?r;?i++)?cur?=?cur?*?10?+?(cs[i]?-?'0');
????????????ans.add(cur);
????????}
????????return?ans;
????}
}
  • 时间复杂度:复杂度与最终结果数相关,最终结果数为「卡特兰数」,复杂度为
  • 空间复杂度:复杂度与最终结果数相关,最终结果数为「卡特兰数」,复杂度为

最后

这是我们「刷穿 LeetCode」系列文章的第 No.241 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文由 mdnice 多平台发布

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:13:18  更:2022-07-04 23:14:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:37:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码