【
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
分治算法,总算遇到了,绕不过。
此题思路:
1.找到字符串中的运算符,将字符串S分割成left和right;
2.递归求解left和right的所有可能结果,遍历求得left和right的所有结果根据运算符计算后的结果;
3.递归终止条件:字符串中已经没有运算符,将字符串转换成数字输出;
分治的思想还是递归处理,但与二叉树和dfs又有些不同,分治需要合并这一步操作。
导致每次递归下来,retarr都需重新申请,表示子串有多少种表达结果,而retarr按照len申请内存居然有用例不过,这也是要小心的点。
合并操作有双重for循环,此题中左边表达式有 cntl 个不同结果,右边表达式有 cntr 个不同结果,那么合并操作就一共有 cntl * cntr 个结

该博客介绍了如何使用分治算法解决LeetCode中的问题241,即如何为一个包含加减乘的运算表达式添加括号,以得到不同的计算结果。通过递归地分割字符串并计算左右部分的不同结果,然后进行运算符合并,最终得到所有可能的组合。博主强调了在递归过程中处理字符串结果和内存申请的注意事项,并指出该问题的解法与二叉树和DFS有所不同,且具有一定的陷阱,需要仔细理解。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



