分而治之——Different Ways to Add Parentheses

来源:互联网 发布:python股票分析系统 编辑:程序博客网 时间:2024/06/06 05:07

问题描述:

给定一个含有数字和运算符的字符串,用所有不同的可能的方法计算所有可能的结果。 有效的运算符是+, - 和*。

解题思路:

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]

由这个例子可以看出,括号的位置决定了计算的顺序,故而计算结果有多种。直接求解比较困难,所以采用分而治之的方法:遍历所给字符串,每次遇到 +  or  -  or  * ,就将原字符串分为两个子串,并对两个子串递归调用这个过程,直到子串的规模减小到我们可以处理的情况,也就是字符串中没有+ or - or * 的情况。


源代码如下:

class Solution {
public:
    vector<int> combine(vector<int> vec1,vector<int> vec2,char ch)
{
    vector<int> result;
    switch (ch)
    {
        case '+':
        {
            for(int i=0;i<vec1.size();i++)
            {
                for(int j=0;j<vec2.size();j++)
                    result.push_back(vec1[i]+vec2[j]);
            }
            break;
        }
        case '-':
        {
            for(int i=0;i<vec1.size();i++)
            {
                for(int j=0;j<vec2.size();j++)
                    result.push_back(vec1[i]-vec2[j]);
            }
            break;
        }
        case '*':
        {
            for(int i=0;i<vec1.size();i++)
            {
                for(int j=0;j<vec2.size();j++)
                    result.push_back(vec1[i]*vec2[j]);
            }
            break;
        }
    }
    return result;
}


bool isNum(string input)
{
    for(int i=0;i<input.size();i++)
    {
        if(input[i]=='+'||input[i]=='-'||input[i]=='*')
            return false;
    }
    return true;
}


vector<int> diffWaysToCompute(string input)
{
    vector<int> result;
    if(isNum(input))
    {
        vector<int> vec;
        int sum=0;
        int c=1;
        for(int i=0;i<input.size();i++)
        {
            if(input[i]>='0'&&input[i]<='9')
            {
                sum=(input[i]-48)+sum*c;
                c*=10;
            }
        }
        vec.push_back(sum);
        return vec;
    }


    for(int i=0;i<input.size();i++)
    {
        if(input[i]=='+'||input[i]=='-'||input[i]=='*')
        {
            string temp1=input.substr(0,i);
            string temp2=input.substr(i+1);
            vector<int> total=combine(diffWaysToCompute(temp1),diffWaysToCompute(temp2),input[i]);
            for(int j=0;j<total.size();j++)
                result.push_back(total[j]);
        }
    }
    return result;
}
};

0 0
原创粉丝点击