每日算法篇-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
((23)-(45)) = -14
((2(3-4))5) = -10
(2((3-4)5)) = -10
(((23)-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。