241. 为运算表达式设计优先级

题目描述:给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
解题思路一:对于每一个运算符号,先执行两边的表达式,然后再处理当前这个符号,采用分治的思想,代码如下:

class Solution:
    def diffWaysToCompute(self, input: str) -> List[int]:
        # res = set()
        nums = []
        ops = []
        n = len(input)
        i = 0 
        while(i < n):
            if not (ord('0') <= ord(input[i]) <= ord('9')):
                ops.append(input[i])
                i += 1
            j = i
            while(j < n and ord('0') <= ord(input[j]) <= ord('9')):
                j += 1
            nums.append(int(input[i:j]))
            i = j
        # from collections import defaultdict
        # G = defaultdict(list)
        def cal(nums, ops):
            if len(nums) == 1:
                return [str(nums[0])]
            n = len(ops)
            ans = []
            for i in range(n):
                left = cal(nums[:i+1], ops[:i])
                right = cal(nums[i+1:n+1], ops[i+1:n])
                for l in left:
                    for r in right:
                        ans.append(str(eval(l+ops[i]+r)))
            return ans
        
        ans = cal(nums, ops)
        return [int(num) for num in ans]
                                
        
            

解题思路二:在思路一中很多子问题的解都重复求解了,改用动态规划自下而上进行求解,代码如下:

class Solution:
    def diffWaysToCompute(self, input: str) -> List[int]:
        # res = set()
        nums = []
        ops = []
        n = len(input)
        i = 0 
        while(i < n):
            if not (ord('0') <= ord(input[i]) <= ord('9')):
                ops.append(input[i])
                i += 1
            j = i
            while(j < n and ord('0') <= ord(input[j]) <= ord('9')):
                j += 1
            nums.append(int(input[i:j]))
            i = j
        from collections import defaultdict
        n = len(nums)
        dp = [[[] for i in range(n)] for _ in range(n)]
        for i in range(n):
            for j in range(n-i):
                for k in range(j,j+i):
                    for left in dp[j][k]:
                        for right in dp[k+1][j+i]:
                            if ops[k] == '+':
                                val = left + right
                            elif ops[k] == '-':
                                val = left - right
                            else:
                                val = left * right
                            dp[j][j+i].append(val)
                if i == 0:
                        dp[j][j+i].append(nums[j])
                
        
        return dp[0][n-1]
                                
        
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值