您的位置:首页 > Web前端

<LeetCode OJ> 241. Different Ways to Add Parentheses

2016-06-16 09:16 751 查看
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题解索引:/article/3664871.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: