241. Different Ways to Add Parentheses

Total Accepted: 23674  Total Submissions: 65569  Difficulty: Medium

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]

Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Hide Tags
  Divide and Conquer
Hide Similar Problems
  (M) Unique Binary Search Trees II (H) Basic Calculator (H) Expression Add Operators

分析:

本题不会,代码纯属借鉴和学习!

这是一个要考虑各种组合情况的问题,关键还是怎么入手得到各种组合情况!

从别人的代码来看,一旦遇到运算符号(不是运算符号暂时不处理),就分治法考虑各种组合情况:

然后将运算结果重新根据当前运算符进行运算。

class Solution {
public:
    vector<int> diffWaysToCompute(string input) {
        vector<int> result;
        int size = input.size();
        for (int i = 0; i < size; i++) {
            char cur = input[i];
            if (cur == '+' || cur == '-' || cur == '*') {//如果是运算符号
                // 分治法,分两边解决,解决获取结果之后重新根据当前符号进行运算
                vector<int> result1 = diffWaysToCompute(input.substr(0, i));//从0位置开始获取长度为i的字符串
                vector<int> result2 = diffWaysToCompute(input.substr(i+1));//从0位置开始获取后面所有字符
                for (auto n1 : result1) {
                    for (auto n2 : result2) {
                        if (cur == '+')
                            result.push_back(n1 + n2);
                        else if (cur == '-')
                            result.push_back(n1 - n2);
                        else
                            result.push_back(n1 * n2);    
                    }
                }
            }
        }
        // 如果输入字符串只是数字(字符数字)
        if (result.empty())
            result.push_back(atoi(input.c_str()));
        return result;
    }
};



完整代码:

#include<iostream>
#include<vector>
using namespace std;

vector<int> diffWaysToCompute(string input) {
    vector<int> result;
    int len=input.size();
    for(int k=0;k<len;k++)
    {
        if(input[k]=='+'||input[k]=='-'||input[k]=='*')
        {
            vector<int> result1=diffWaysToCompute(input.substr(0,k));
            vector<int> result2=diffWaysToCompute(input.substr(k+1));
            for(vector<int>::iterator i=result1.begin();i!=result1.end();i++)
                for(vector<int>::iterator j=result2.begin();j!=result2.end();j++)
                {
                    if(input[k]=='+')
                        result.push_back((*i)+(*j));
                    else if(input[k]=='-')
                        result.push_back((*i)-(*j));
                    else
                        result.push_back((*i)*(*j));
                }
        }
    }
    if(result.empty())
        result.push_back(atoi(input.c_str()));
    return result;
}
int main()
{
    string input="2*3-4*5";
    vector<int> vec;
    vec=diffWaysToCompute(input);
    for(int i=0;i<vec.size();i++)
        cout<<vec[i]<<' ';
    cout<<endl;
    system("pause");
}




注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/51581228

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

你可能感兴趣的:(LeetCode,C++,算法,面试,动态规划)