• Different Ways to Add Parentheses


    #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;
        }
    };

    注意:正数不代表个位数!!!一定要考虑

            另外,这道题里面没有考虑负数

  • 相关阅读:
    列表和元组
    UVM宏
    UVM中重要函数
    组合模式(composite)
    装饰器模式(Decorator)
    适配器模式(Adapter)
    桥接模式
    原型模式(prototype)
    单例模式(singleton)
    UML类图
  • 原文地址:https://www.cnblogs.com/julie-yang/p/5150934.html
Copyright © 2020-2023  润新知