LeetCode 241. Different Ways to Add Parentheses

简介: 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

v2-680e21b67163abc22f7214b03a02d832_1440w.jpg

Description



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"

Output: [0, 2]


Explanation:

((2-1)-1) = 0

(2-(1-1)) = 2


Example 2:


Input: "2*3-4*5"

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


Explanation:

(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


描述



给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。


示例 1:

输入: "2-1-1"

输出: [0, 2]

解释:

((2-1)-1) = 0

(2-(1-1)) = 2


示例 2:

输入: "2*3-4*5"

输出: [-34, -14, -10, -10, 10]


解释:

(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


思路



  • 这道题使用递归求解.
  • 以每一个操作符为分割点,我们将给定的字符串分割成两个字串,假设我们递归求解得到了左边的所有组合结果left,右边的所有组合right,我们以当前符号为分隔符,把left和right中的所有数用当前运算符做运算,得到最终结果.
  • 递归终止条件,输入的字符串只包含一个数字.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-02-02 15:19:33
# @Last Modified by:   何睿
# @Last Modified time: 2019-02-02 16:51:16
class Solution:
    def diffWaysToCompute(self, input):
        """
        :type input: str
        :rtype: List[int]
        """
        sovled = {}
        _input = input
        return list(self.__recursion(sovled, _input))
    def __recursion(self, sovled, _input):
        # 有记录的递归,如果当前求解的字符串已经求解过了,我们直接返回结果.
        if _input in sovled: return sovled[_input]
        patial, num = [], 0
        for i in range(len(_input)):
            # 从字符串中取出数字
            if _input[i].isdigit():
                num = num * 10 + int(_input[i])
            # 如果当前位置是符号
            elif _input[i] == '+' or _input[i] == "-" or _input[i] == '*':
                # 以当前位置为分隔
                # 递归求解当前位置左边字符串的解
                left = self.__recursion(sovled, _input[0:i])
                # 递归求解当前位置右边字符串的解
                right = self.__recursion(sovled, _input[i + 1:])
                # 将当前位置左边的解和右边的解用当前的符号进行组合
                for x in left:
                    for y in right:
                        patial.append(self.__cal(_input[i], x, y))
                num = 0
        if not patial: patial.append(num)
        sovled[_input] = patial
        # 返回当前的解
        return patial
    def __cal(self, operator, num1, num2):
        # 题目给定只有三个运算符    
        if operator == "+": return num1 + num2
        if operator == "-": return num1 - num2
        if operator == "*": return num1 * num2


源代码文件在这里


目录
相关文章
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
47 0
|
存储 C++ Python
LeetCode刷题---Add Two Numbers(一)
LeetCode刷题---Add Two Numbers(一)
|
存储 算法 安全
LeetCode - #2 Add Two Numbers
我们社区从本期开始会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。
LeetCode - #2 Add Two Numbers
LeetCode 415. Add Strings
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
95 0
LeetCode 415. Add Strings
LeetCode 301. Remove Invalid Parentheses
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。 说明: 输入可能包含了除 ( 和 ) 以外的字符。
71 0
LeetCode 301. Remove Invalid Parentheses
LeetCode 258. Add Digits
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
70 0
LeetCode 258. Add Digits
LeetCode 67. Add Binary
给定两个二进制字符串,返回它们的总和(也是二进制字符串)。 输入字符串都是非空的,只包含字符1或0。
75 0
LeetCode 67. Add Binary
|
存储
Leetcode-Medium 2. Add Two Numbers
Leetcode-Medium 2. Add Two Numbers
67 0
|
Python
Leetcode-Easy 989. Add to Array-Form of Integer
Leetcode-Easy 989. Add to Array-Form of Integer
132 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行