#include<math.h> class Solution { public: vector<int> diffWaysToCompute(string input) { //这个函数用来把输入“拆解” eg 11+12+13 11 , + ,12 ,+ ,13 拆解后放在input_0中 vector<int > res; int len = input.length(); if(len < 1) return res; vector<string > input_0; int len0=0; string temp=""; for(int i=0;i<len;i++){ if(input[i] == '+' ||input[i] == '-'||input[i] == '*'){ input_0.push_back(temp); temp = ""; temp += input[i]; input_0.push_back(temp); temp = ""; len0+=2; continue; } temp+=input[i]; } input_0.push_back(temp); len0+=1; return diffWaysToCompute(input_0,0,len0-1); } vector<int> diffWaysToCompute(vector<string> & input_0,int left,int right) { //这是最主要的计算函数,“动态规划的思想”,体现在for循环那里 分为(左)op(右) vector<int> res; int len0=right-left+1; if(len0%2==0) return res; if(len0==1){ res.push_back(string_to_int(input_0[left])); return res; } if(len0 == 3){ res.push_back(simple_op(string_to_int(input_0[left]),string_to_int(input_0[right]),input_0[left+1][0])); return res; } vector<int > res_a; vector<int > res_b; for(int i=0;i<len0-2;i+=2) //i=0对应【{11},{12+13}】 i=2对应【{11+12},{13}】 { cout<<i<<endl; char op = input_0[left+i+1][0]; res_a = diffWaysToCompute(input_0,left,left+i); //得到左边结果 eg 【{11}直接返回 】 res_b = diffWaysToCompute(input_0,left+i+2,right); //得到右边结果 eg 【{12+13}返回25】 op_left_right(res_a,res_b,op,res); } return res; } void op_left_right(vector<int > &res_a,vector<int > &res_b,char op,vector<int > &res){ //利用左边的结果 和 右边的结果 得到该表达式的结果 for(int i=0;i<res_a.size();i++) for(int j=0;j<res_b.size();j++){ res.push_back(simple_op(res_a[i],res_b[j],op)); } } int string_to_int(string s){ //把string变成int int res = 0; int len = s.length(); for(int i=len-1;i>=0;i--){ res += (s[len-1-i]-'0') * pow(10,i); } return res; } int simple_op(int a,int b,char op){ //两个数 一个运算符 得到一个结果 int res; switch (op){ case '-': res=a - b; break; case '+': res=a + b; break; case '*': res=a * b; break; } return res; } };
注意:正数不代表个位数!!!一定要考虑
另外,这道题里面没有考虑负数