这个问题现在已经有几天了,我想知道什么是解决这个问题的最简单和最好的方法。决定与SO社区讨论。
问题状态,我们有一个字符串,其中包含一些数字和一些操作(有效操作只有+, - 和*),现在通过以下方式找到此数学表达式的所有可能答案在所有可能的地方放置大括号。
例如,如果输入字符串是" 1 + 2-3 * 4"
答案可以是
(((1 + 2)-3)* 4)= 0
(((1 + 2) - (3 * 4))= - 9
(1 +((2-3)* 4)= -3
(1+(2-(3 * 4)))= - 9
((1+(2-3))* 4)= 0
像这样,(我可能会遗漏一些案例或计算错误,但你明白了:D ),而假设我们总是在字符串中有效输入,只有1最初的数字,我们必须打印所有可能的答案组合,这可能是最简单和/或最好的算法。
PS:我不知道这个社区是否适合这样的问题,但我看到很多这样的问题,所以我发布了这个,如果这不是正确的社区这些问题,请指导我哪一个。三江源。
答案 0 :(得分:2)
所以这看起来像一个简单的递归问题,而你的递归步骤应该是(我将把编码留给你):
“在这里打开一对括号并继续”
并且,如果适用(您背后有开放式括号):
“在这里关闭一对括号并继续”
包装 - 确保在编写代码时考虑到表达式的合法性:
当您到达表达式的末尾时,计算并打印出一个值。
修改强>
伪代码会是这样的(在运行中编写它,没有考虑到极端情况等等,但只是足以让你得到一般的想法):
public void Solve(string expression,int positions, int currentPosition, int numberOfOpened ,int[] brackets){
if (currentPosition == positions){
// We are done, this method can be implemented by using a stack and
// various solutions can be found across StackOverflow.
PrintSolution(expression,brackets);
return;
}
// Close and continue recursion
if (numberOfOpened > 0){
int[] newBrackets = CloneAndAddClosingBracket(brackets);
Solve(expression,positions,currentPosition++,numberOfOpened-1,newBrackets);
}
// Open and continue recursion
int[] newBrackets = CloneAndAddOpeningBracket(brackets);
Solve(expression,positions,currentPosition++,numberOfOpened+1,newBrackets);
}
答案 1 :(得分:1)
((1 + 2)x3):-------------------------(1+(2x3)):
x +
/ \ / \
+ 3 1 x
/ \ / \
1 2 2 3
用于打印结果,只需在树中的每个函数周围放置括号