6038. 向表达式添加括号后的最小结果

给你一个下标从 0 开始的字符串 expression ,格式为 "<num1>+<num2>" ,其中 <num1> 和 <num2> 表示正整数。

请你向 expression 中添加一对括号,使得在添加之后, expression 仍然是一个有效的数学表达式,并且计算后可以得到 最小 可能值。左括号 必须 添加在 '+' 的左侧,而右括号必须添加在 '+' 的右侧。

返回添加一对括号后形成的表达式 expression ,且满足 expression 计算得到 最小 可能值如果存在多个答案都能产生相同结果,返回任意一个答案。

生成的输入满足:expression 的原始值和添加满足要求的任一对括号之后 expression 的值,都符合 32-bit 带符号整数范围。

示例 1:

输入:expression = "247+38"
输出:"2(47+38)"
解释:表达式计算得到 2 * (47 + 38) = 2 * 85 = 170 。
注意 "2(4)7+38" 不是有效的结果,因为右括号必须添加在 '+' 的右侧。
可以证明 170 是最小可能值。

示例 2:

输入:expression = "12+34"
输出:"1(2+3)4"
解释:表达式计算得到 1 * (2 + 3) * 4 = 1 * 5 * 4 = 20 。

示例 3:

输入:expression = "999+999"
输出:"(999+999)"
解释:表达式计算得到 999 + 999 = 1998 。

提示:

  • 3 <= expression.length <= 10
  • expression 仅由数字 '1' 到 '9' 和 '+' 组成
  • expression 由数字开始和结束
  • expression 恰好仅含有一个 '+'.
  • expression 的原始值和添加满足要求的任一对括号之后 expression 的值,都符合 32-bit 带符号整数范围

题意理解:由于本题字符串最多只有10位,所以想到用遍历的方法来求解,对于字符串的处理一些操作需要记忆一下。


class Solution {
public:
    long long int static cal(string s) {
    string first = "";
    string second="";
    int left=0,right=0,sign=0;
    for(int i=0;i<s.size();i++)
        if(s[i]=='(')
            left=i;
        else if(s[i]==')')
            right=i;
        else if(s[i]=='+')
            sign=i;
    string s1,s2,s3,s4;
    if(left==0)
        s1="";
    else s1=s.substr(0,left);//注意取子串的操作的第二个变量是len
    s2=s.substr(left+1,sign-1-left);
    s3=s.substr(sign+1,right-1-sign);
    s4=s.substr(right+1,s.size()-right);
    long long int  res=0;
    long long int a1,a2,a3,a4;
    if(s1.size()!=0) {
        a1 = stod(s1);
    }
    else a1 = 1;

    if(s2.size()!=0)
        a2=stod(s2);
    if(s3.size()!=0)
        a3=stod(s3);
    if(s4.size()!=0)
        a4=stod(s4);
    else
    {
        a4=1;
    }
 res=a1*(a2+a3)*a4;
    return res;

}
    string minimizeResult(string expression) {
         int gap = 0;
    for (int i = 0; i < expression.size(); i++) {
        if (expression[i] == '+')
            gap = i;
    }
    long long int  res = 1000000000;
        string str;
    for (int i = 0; i < gap; i++)
        for (int j = gap+3; j <= expression.size()+1 ; j++) {
            expression = expression.insert(i, "(");
            expression = expression.insert(j, ")");
            if(res>cal(expression))
            {
                res=cal(expression);
                str=expression;
            }
            expression.erase(remove(expression.begin(), expression.end(), '('), expression.end());//去除expression中所有的左括号!!
            expression.erase(remove(expression.begin(), expression.end(), ')'), expression.end());
        }
    return str;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值