(算法分析Week1)Different Ways to Add Parentheses[Medium]

来源:互联网 发布:各国语言在线翻译软件 编辑:程序博客网 时间:2024/05/29 14:31

241. Different Ways to Add Parentheses[Medium]

Description

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 *.

Example 1

Input: “2-1-1”.

((2-1)-1) = 0(2-(1-1)) = 2

Output: [0, 2]


Example 2

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]


Solution

分治法,以各个操作符(+、-、*)为分割,分别计算每个“小块”的结果,然后再进行全排列。自然而然想到递归,然而一开始并没有想好应该怎么设计分割后的计算结果并返回的接口,想着自己要增加函数。发现顺着题目编辑栏给出的函数原型考虑,返回一个int类型的vector就可以满足储存不同计算结果的需求。概括地说,对于每一个操作符,不停分隔左右边,然后相应返回不同情况下的result,相当于执行了【在不同位置上加上括号的要求】


Complexity analysis

时间复杂度O(Catalan(n)) 即O((2n)! / n!(n-1)!)
空间复杂度O(n),递归时系统栈空间的消耗
n为数操作符个数

这里是按网上说的,其实不会计算时间复杂度…有空再研究

Code

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


Result这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没通过交警车主全责不垫付怎么办 开车撞伤人交警说车主全责怎么办 面对喜欢上网又判逆的儿子怎么办 五年级了计算题老是出错怎么办 三年级的孩子老是计算题出错怎么办 写在表上的字写错了怎么办不能涂改 我的孩子做作业很马虎怎么办 幼儿园老师把学生名字写错怎么办 孩子的手写字磨了疙瘩怎么办 我家孩子上一年级算题特慢怎么办 脚注太多导致与正文距离太大怎么办 搜狗输入法打字不显示选字框怎么办 粘贴文字时带自动添加了序号怎么办 电脑上是表字打印出来是坔怎么办 不同颜色的衣服一起洗染色了怎么办 两岁宝宝不爱吃饭怎么办且消瘦 一岁两个月宝宝不爱吃饭怎么办 罗汉鱼头座大颜色不红怎么办 为什么孩子的牙都是龋齿怎么办呀 蓝迪儿童墙膜出现气泡了怎么办 空sd卡或文件系统不受支持怎么办 8个月宝宝吃了纸怎么办 宝宝出生两天了不吃不喝怎么办 八个月宝宝阴唇边红肿痛怎么办 儿童五周岁九个月比同龄矮怎么办 8个月宝宝长牙母乳喂养咬人怎么办 6周的孩子视力低常怎么办 宝宝吃了甜食生痰咳嗽怎么办 两个月的边牧抵抗力差怎么办 阴茎勃起后向上翘的厉害怎么办 5个月宝宝发烧38.5度怎么办 9个月宝宝发烧38.5度怎么办 八个月宝宝只吃母乳不吃奶粉怎么办 八个月母乳不够宝宝不吃奶粉怎么办 八个月宝宝吃母乳不吃奶粉怎么办 八个月宝宝戒奶不吃奶粉怎么办 刚满月的宝宝发烧38度怎么办 未满月的宝宝发烧38度怎么办 半月大的婴儿吃奶就漾奶怎么办 上司交给你不能完成的任务怎么办 电脑光驱里放入光碟放不出来怎么办