给你一个下标从 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;
}
};