Leetcode: 241. Different Ways to Add Parentheses

本文探讨了LeetCode上的一道经典题目:不同方法添加括号。通过递归策略,文章详细解释了如何计算字符串中所有可能的运算结果,涵盖加、减、乘三种运算符。示例代码采用Golang实现,附带单元测试验证正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

https://leetcode.com/problems/different-ways-to-add-parentheses/

描述

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: “23-45”
Output: [-34, -14, -10, -10, 10]
Explanation:
(2*(3-(45))) = -34
((2
3)-(45)) = -14
((2
(3-4))5) = -10
(2
((3-4)5)) = -10
(((2
3)-4)*5) = 10

解题思路

自顶向下,分而治之进行递归,如果遇到(+,-,*)任何符号则将字符串一分为二,分别计算左边可以产生的结果和右边产生的结果,然后将结果做笛卡尔乘积,向上层返回结果。

示例代码(第一次使用golang刷题)

func diffWaysToCompute(input string) []int {
	res := []int{}
	flag := true
	for i := 0; i < len(input); i++ {
		if input[i] == '+' ||
			input[i] == '-' ||
			input[i] == '*' {
			flag = false
			leftpart := diffWaysToCompute(input[0:i])
			rightpart := diffWaysToCompute(input[i+1:])
			for _,left := range leftpart {
				for _,right := range rightpart {
					if input[i] == '+' {
						tmp := left + right
						res = append(res,tmp)
					} else if input[i] == '-' {
						tmp := left - right
						res = append(res,tmp)
					} else if input[i] == '*' {
						tmp := left * right
						res = append(res,tmp)
					}
				}
			}
		}
	}

	if flag {
		i, err := strconv.Atoi(input)
		if err != nil {
			panic("err number!")
		}
		res = append(res, i)
	}
	return res
}

单元测试


import (
	"fmt"
	"testing"
)

func TestDiffWaysToCompute(t *testing.T) {
	res := diffWaysToCompute("2*3-4*5")
	fmt.Printf("res : %v",res)
	if len(res) != 5 {
		t.Errorf("err res: %v",res)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值