博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 241. Different Ways to Add Parenthess 解题报告
阅读量:2359 次
发布时间:2019-05-10

本文共 1814 字,大约阅读时间需要 6 分钟。

LeetCode 241. Different Ways to Add Parentheses 解题报告

题目描述

Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +, - and *.


示例

Example1 :

Input: “2-1-1”.

((2-1)-1) = 0

(2-(1-1)) = 2

Output: [0, 2]

Example2 :

Input: “2*3-4*5”

(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

Output: [-34, -14, -10, -10, 10]


注意事项

没有。


解题思路

我的思路:

这道题使用分治策略进行解题。很关键的一点,每一个运算符都可以成为最后执行的那一个运算符,因此,以运算符为界,把字符串分为左右两个子字符串,分别求子字符串可能的结果,再将左右对应结果相乘,因为求子字符串的结果,与求原始字符串的结果是同样的问题,所以子字符串可以按同样的方式的分解,最后分解的边界是只有单个数字字符。

所以只要遍历一次字符串,分别以各个运算符为最后一个执行的运算符,算出可能的结果,最后返回所有计算出的结果就行。
需要注意的是字符串可能不包含运算符,这种情况相当于分解的边界情况。


代码

我的代码

class Solution {public:    vector
diffWaysToCompute(string input) { vector
result; for (int i = 0; i < input.size(); i++) { if (!isdigit(input[i])) { vector
left = diffWaysToCompute(input.substr(0, i)); vector
right = diffWaysToCompute(input.substr(i + 1)); for (int l: left) { for (int r: right) { if (input[i] == '+') result.push_back(l + r); if (input[i] == '-') result.push_back(l - r); if (input[i] == '*') result.push_back(l * r); } } } } if (result.empty()) result.push_back(atoi(input.c_str())); return result; }};

总结

这道题是使用分治策略,关键的一点是懂得怎么将原始问题分解为同样类型的子问题,因为原始问题是求字符串所有可能的运算顺序的结果,因此对问题进行分解的方向就是将原始字符串分为更小的子字符串,同时计算出分解的子字符串的结果能够用于求原始字符串的结果,结合每个运算符都会成为一次最后执行的运算符这一点就能得知分解的方式是以运算符为界进行划分。

通过这道题,我复习了一遍分治的思想,应用分治最重要的是选择正确地分解方式,并且知道分解的边界是什么。这是本周完成的第三道题,下周继续,加油~

转载地址:http://yqntb.baihongyu.com/

你可能感兴趣的文章
写科研论文的高级方法学 -- 小木虫上的精华(推荐阅读)
查看>>
Good News -- 投稿到《机器人》的论文也被录用了
查看>>
In this paper 与 In this study 的区别
查看>>
敏捷开发一千零一问系列之三十六:如何做小版本迭代的代码管理
查看>>
敏捷开发产品管理系列之九:划分产品子系统
查看>>
敏捷开发一千零一问系列之三十六:跨平台开发的人员和代码复用
查看>>
关于微软的VB和C#:为何Basic需要存在,为何VB如此像C#,为何两者不合并等
查看>>
度量分析之报告信息的四个层次:数据,信息,分析,措施
查看>>
如何将asp.net MVC2项目升级为MVC3项目(微软官方自动升级工具:ASP.NET MVC 3 Application Upgrader )
查看>>
怎样在Razor中使用HtmlHelper(MvcHtmlString)
查看>>
彼得定律与员工职业生涯规划(该提拔谁,职业规划,知人善用)
查看>>
敏捷开发一千零一问系列之十三:故事点好还是人天好?
查看>>
敏捷开发日常跟进系列之四:跟进表
查看>>
敏捷开发免费管理工具——火星人预览之一:需求与故事树
查看>>
敏捷开发免费管理工具——火星人预览之二:编辑故事,产品管理,组织结构
查看>>
敏捷开发免费管理工具——火星人预览之三:迭代,计划会,分配
查看>>
敏捷开发免费管理工具——火星人预览之四:故事板,燃尽图,我的工作项
查看>>
敏捷开发免费管理工具——火星人预览之五:常见问题问答
查看>>
CSDN10大博客栏目火热评选中
查看>>
敏捷开发团队管理系列之五:大型研发团队的切分(刚参加3.17 MDP团队管理场次的读者请看)
查看>>