给定多项式任意加括号求所有输出结果

问题描述

20171223103914818.png

基本思路:分治

代码

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
        vector<int> res;
        for(int i = 0; i < input.size(); ++i)//枚举串的每个位置
        {
            //如果是操作符,就将左右两边分开
            if(isOperator(input[i]))
            {
                //返回左边和右边的所有可能结果
                vector<int> lhs = diffWaysToCompute(input.substr(0, i));
                vector<int> rhs = diffWaysToCompute(input.substr(i + 1));
                //依次组合,因为返回之前考虑了为空的情况,所以这里无需判断是否为空
                for(auto n1 : lhs)//对于左边的每一个数,枚举右边的数,记录这两个数进行第i位操作符后产生的结果
                {
                    for(auto n2 : rhs)
                    {
                        if(input[i] == '+') res.emplace_back(n1 + n2);
                        else if(input[i] == '-')    res.emplace_back(n1 - n2);
                        else    res.emplace_back(n1 * n2);
                    }
                }
            }
        }
        if(res.empty())
        {
            //可以添加一条语句判断input是空字符的情况
            //if(input.empty()) input.append(1, '0');
            int n = 0;
            sscanf(input.c_str(), "%d", &n);
            res.emplace_back(n);
        }
        return res;
    }
private:
    bool isOperator(char op)
    {
        return op == '+' || op == '-' || op == '*';
    }
};

举例子

23-45
如果现在是第一个*
左边就是2,右边就是3-45,对于右边的递归调用 可能是-5,-17,然后用动态数组res添加枚举的两个数,即2-5与2*-17

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,142评论 0 3
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,693评论 0 89
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,096评论 0 0
  • 以下这些话本来是在第一天写诗就想说的,拖到今天: 我写诗,纯粹是为了走出现实生活,在巨浪下翻转。 有天看到评论里一...
    锄风少年阅读 2,622评论 0 0
  • MS思考:Android面试一天一题(7 Day):Java相关 1.Switch能否用string做参数? 在J...
    嘉了个桀阅读 4,472评论 0 49