分而治之——Different Ways to Add Parentheses

本文介绍了一种通过递归方法解析并计算包含加、减、乘运算的字符串表达式的算法实现。该方法通过分治思想,将复杂表达式分解为简单子表达式进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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

解题思路:

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;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值