每日一算法(23)

每日算法篇-LeeCode篇

“都说眼睛是心灵的窗户,确实如此,一个连眼神都表达着坚定的人,怎么会有别的想法呢。”——努力成为程序员的耿耿(2021/11/15)

题目

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

解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:
输入: “23-45”
输出: [-34, -14, -10, -10, 10]

解释:
(2*(3-(45))) = -34
((2
3)-(45)) = -14
((2
(3-4))5) = -10
(2
((3-4)5)) = -10
(((2
3)-4)*5) = 10

题目来源于Leecode
思考: 这在Leecode属于中等难度的题,在我这个程度,涉及这个有点困难了,慢慢学。首先这个题目的意思就是运算等级的不同产生不同的结果。那么就成了在哪里加括号的问题,或者是在哪里划分等级的问题。
看了答案,才明白的分治法。就是把大问题,通过一个一个判断条件,把化成小问题,再通过递归将小问题融合成大问题。
1.按照运算符分解
2.递归到最底层每一个数字,进行运算符运算
3.回到上一层,知道回到整个字符串

def diffWaysToCompute(string):
	if string.isdigit():#分治到最低层时
		return(int(string))#注意不能返回(int(string))在下边用了enumerate必须是一个课迭代的对象,整形不属于,所以返回一个列表即可
	res=[] #用来存放当前的结果
	for index,char in enumerate(string):
		if char in['+','-','*']:#通过这些判断条件,进行划分
			left=diffWaysToCompute(string[:index])#左侧递归
			right=diffWaysToCompute(string[index+1:])#右侧递归
			for i in left: #递归到最后是两个数组之间的运算
				for j in right:
					if char=='+':
						res.append(i+j)
					elif char=='-':
						res.append(i-j)
					else:
						res.append(i*j)
	return res

递归一直是一个表难的思路,但递归绝对很好。这次学习了分治法的递归,就是通过大问题到小问题,再从小问题到大问题的一个往返路线。
关注我,每天学习算法,练习Python。

你可能感兴趣的:(数据结构,算法,leetcode,动态规划)