• [leetcode 241]Different Ways to Add Parentheses


    Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are+- and *.


    Example 1

    Input: "2-1-1".

    ((2-1)-1) = 0
    (2-(1-1)) = 2

    Output: [0, 2]


    Example 2

    Input: "2*3-4*5"

    (2*(3-(4*5))) = -34
    ((2*3)-(4*5)) = -14
    ((2*(3-4))*5) = -10
    (2*((3-4)*5)) = -10
    (((2*3)-4)*5) = 10

    Output: [-34, -14, -10, -10, 10]

    给定一个字符串含有数字字符和+、-、*(没说有没有空格,就当有空格处理)

    代码一多,就有点乱,思路大体是:

    1、将输入字符串依照数字和运算符号分离,按顺序分别存入两个vector;

    2、使用二维的vector作为标记,vector[i][j]表示字符串i到j的运算结果。由于运算结果可能有多个还有可能反复所以使用multiset

    3、动态的计算vector[i][j],知道得到结果vector[0][input.size()-1];

    AC代码:

    class Solution
    {
    public:
        vector<int> diffWaysToCompute(string input)
        {
            int sum=0;
            vector<int> num;
            vector<char> sign;
            int len=input.size();
            int x=0;
            int y=0;
            vector<int> res;
            while(x<len)
            {
                if(input[x]>='0'&&input[x]<='9')
                {
                    y=0;
                    while(x<len&&input[x]>='0'&&input[x]<='9')
                    {
                        y=y*10+input[x]-48;
                        ++x;
                    }
                    num.push_back(y);
                    ++sum;
                }
                else if(input[x]==' ')
                    ++x;
                else
                {
                    sign.push_back(input[x]);
                    ++x;
                }
            }
            vector<vector<multiset<int> > > temp;
            multiset<int> temp_set;
            vector<multiset<int> >temp_vec;
            for(int i=0; i<sum; ++i)
                temp_vec.push_back(temp_set);
            for(int i=0; i<sum; ++i)
                temp.push_back(temp_vec);
            for(int i=0; i<sum; ++i)
                temp[i][i].insert(num[i]);
            for(int i=1; i<sum; ++i)
            {
                if(sign[i-1]=='+')
                    temp[i-1][i].insert(num[i-1]+num[i]);
                else if(sign[i-1]=='-')
                    temp[i-1][i].insert(num[i-1]-num[i]);
                else
                    temp[i-1][i].insert(num[i-1]*num[i]);
            }
            for(int i=2; i<sum; ++i)
            {
                for(int j=0; j+i<sum; ++j)
                {
                    multiset<int>::iterator ite=temp[j][j].begin();
                    for(multiset<int>::iterator ite2=temp[j+1][i+j].begin(); ite2!=temp[j+1][i+j].end(); ++ite2)
                    {
                        if(sign[j]=='+')
                            temp[j][i+j].insert(*ite+(*ite2));
                        else if(sign[j]=='-')
                            temp[j][i+j].insert(*ite-(*ite2));
                        else
                            temp[j][i+j].insert(*ite*(*ite2));
                        }
                    ite=temp[i+j][i+j].begin();
                    for(multiset<int>::iterator ite2=temp[j][i+j-1].begin(); ite2!=temp[j][i+j-1].end(); ++ite2)
                    {
                        if(sign[i+j-1]=='+')
                            temp[j][i+j].insert(*ite2+(*ite));
                        else if(sign[j+i-1]=='-')
                            temp[j][i+j].insert(*ite2-(*ite));
                        else
                            temp[j][i+j].insert(*ite2*(*ite));
                        }
                    for(int k=j+1; k<i+j-1; ++k)
                    {
                        for(multiset<int>::iterator ite2=temp[j][k].begin(); ite2!=temp[j][k].end(); ++ite2)
                        {
                            for(multiset<int>::iterator ite3=temp[k+1][j+i].begin(); ite3!=temp[k+1][j+i].end(); ++ite3)
                            {
                                if(sign[k]=='+')
                                    temp[j][i+j].insert(*ite2+(*ite3));
                                else if(sign[k]=='-')
                                    temp[j][i+j].insert(*ite2-(*ite3));
                                else
                                    temp[j][i+j].insert(*ite2*(*ite3));
                                }
                        }
                    }
                }
            }
            for(multiset<int>::iterator ite2=temp[0][sum-1].begin();ite2!=temp[0][sum-1].end();++ite2)
                res.push_back(*ite2);
            return res;
        }
    };
    

    其它Leetcode题目AC代码:https://github.com/PoughER/leetcode

  • 相关阅读:
    字节序(Endian),大端(BigEndian),小端(LittleEndian)
    关于PHOTO SHOP CS9.0无法启动adobe updater 请重新安装应用程序和组件解决方法!
    工作·事业·人生
    多选列表Select之双击删除与添加Demo
    WIN7任务栏修复解决windows7任务栏不能停靠图标的问题
    ip地址被绑定,vmware无法共享上网,
    小屋·小篮子·祭
    基础知识提问:关于HashTable和List两个容器Add改变了属性的同一对象的问题
    [转载]正则表达式30分钟入门教程及MTracer(破解版)
    让程序更健壮,用错误还是抛异常?
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6845778.html
Copyright © 2020-2023  润新知