Leetcode

2019-02-02

2019-02-02  本文已影响0人  ruicore
LeetCode 241. Different Ways to Add Parentheses.jpg

LeetCode 241. Different Ways to Add Parentheses

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

思路

# -*- 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

源代码文件在这里.
©本文首发于何睿的博客,欢迎转载,转载需保留文章来源,作者信息和本声明.

上一篇下一篇

猜你喜欢

热点阅读