給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。
示例 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
可以通過運算子將每乙個式子分成兩部分,如例二
2*3-4*5
可以通過運算子分成
(2*3) - (4*5) = -14
(2*3-4) * 5
*((2*3)-4) * 5 = 10
*(2*(3-4)) * 5 = -10
**實現如下:
class solution
//如果已經有當前解了,直接返回
if(map.containskey(input))
listresult = new arraylist<>();
int num = 0;
int index = 0;
while (index < input.length() && !isoperation(input.charat(index)))
if (index == input.length()) //沒有運算子,直接就是數字了
for (int i = 0; i < input.length(); i++) }}
}//存到 map
map.put(input, result);
return result;
}private int caculate(int num1, char c, int num2)
return -1;
}private boolean isoperation(char c)
}
解題思路:
動態規劃的關鍵之處就是要定義dp陣列的含義,這裡有乙個巧妙的做法就是將數字和運算子分開
2 * 3 - 4 * 5
存起來的數字是 numlist = [2 3 4 5],
存起來的運算子是 oplist = [*, -, *]。
這樣dp陣列的含義就是第i個數字到第j個數字直接有多少種運算結果
初始化就是
dp[i][i] = 第i個數字
有了乙個數字的運算結果,我們就能得到兩個數字的運算結果,依次類推
問題是分隔它們的運算子應該是哪乙個?
分隔它們的運算子就是左式最後乙個數字的下標
2 * 3 - 4 * 5
存起來的數字是 numlist = [2 3 4 5],
存起來的運算子是 oplist = [*, -, *]。
假設我們求 dp[1][3]
也就是計算 3 - 4 * 5 的解
分成 3 和 4 * 5 兩部分,3 對應的下標是 1 ,對應的運算子就是 oplist[1] = '-' 。
也就是計算 3 - 20 = -17
分成 3 - 4 和 5 兩部分,4 的下標是 2 ,對應的運算子就是 oplist[2] = '*'。
也就是計算 -1 * 5 = -5
所以 dp[1][3] = [-17 -5]
**如下:
public listdiffwaystocompute(string input)
num = num * 10 + array[i] - '0';
}numlist.add(num);
int n = numlist.size(); // 數字的個數
// 乙個數字
arraylist dp = (arraylist) new arraylist[n][n];
for (int i = 0; i < n; i++)
// 2 個數字到 n 個數字
for (int n = 2; n <= n; n++)
arraylistresult = new arraylist<>();
// 分成 i ~ s 和 s+1 ~ j 兩部分
for (int s = i; s < j; s++) }}
dp[i][j] = result;}}
return dp[0][n-1];
}private int caculate(int num1, char c, int num2)
return -1;
}private boolean isoperation(char c)
241 為運算表示式設計優先順序
思路 分治法 不同位置新增括號的作用在於改變不同運算子的優先順序。所以,可以在遍歷的過程中依次把運算子設為第一優先順序,遞迴計算左邊和右邊。class solution def diffwaystocompute self,input str list int if input isdigit 全數...
241 為運算表示式設計優先順序
給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 示例 1 輸入 2 1 1 輸出 0,2 解釋 2 1 1 0 2 1 1 2 示例 2 輸入 23 45 輸出 34,14,10,10,10 解釋 2 3...
241 為運算表示式設計優先順序
題目描述 給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 解題思路一 對於每乙個運算符號,先執行兩邊的表示式,然後再處理當前這個符號,採用分治的思想,如下 class solution def diffw...