枚举每个符号作为中间符号,递归计算两边所有可能,组合在一起即可
class Solution {
public:
vector<int> num;
vector<char> op;
vector<int> dfs(int l,int r)
{
if(l==r) return {num[l/2]};
vector<int> now;
for(int i=l+1;i<r;i+=2)
{
vector<int> lc=dfs(l,i-1),rc=dfs(i+1,r);
for(int j=0;j<lc.size();j++)
for(int k=0;k<rc.size();k++)
{
if(op[i/2]=='+') now.push_back(lc[j]+rc[k]);
else if(op[i/2]=='-') now.push_back(lc[j]-rc[k]);
else now.push_back(lc[j]*rc[k]);
}
}
return now;
}
vector<int> diffWaysToCompute(string input) {
int n=input.size();
for(int i=0;i<n;i++)
if(!('0'<=input[i]&&input[i]<='9'))
op.push_back(input[i]),input[i]=' ';
stringstream ss(input);
for(int x;ss>>x;num.push_back(x));
return dfs(0,op.size()+num.size()-1);
}
};