0
点赞
收藏
分享

微信扫一扫

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

耶也夜 2022-04-13 阅读 41
leetcode

给你一个下标从 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 带符号整数范围

C++

class Solution {
public:
    string minimizeResult(string expression) {
        int index=0;
        int n=expression.size();
        for(int i=0;i<n;i++) {
            if(expression[i]=='+') {
                index=i;
                break;
            }
        }
        int res=atoi(expression.substr(0,index).c_str())*atoi(expression.substr(index+1).c_str());
        string ans="("+expression+")";
        for(int i=0;i<index;i++) {
            int left=1;
            string a;
            if(i>0) {
                left*=atoi(expression.substr(0,i).c_str());
                a+=expression.substr(0,i);
            }
            int v1=atoi(expression.substr(i,index-i).c_str());
            string b=expression.substr(i,index-i);
            for(int j=index+1;j<n;j++) {
                int v2=atoi(expression.substr(index+1,j-index).c_str());
                string c=expression.substr(index+1,j-index);
                int right=1;
                string d;
                if(j<n-1) {
                    right*=atoi(expression.substr(j+1).c_str());
                    d+=expression.substr(j+1);
                }
                int val=left*(v1+v2)*right;
                if(val<res) {
                    res=val;
                    ans=a+"("+b+"+"+c+")"+d;
                }
            }
        }
        return ans;
    }
};
举报

相关推荐

0 条评论