為運算表示式設計優先順序

2021-10-08 19:06:03 字數 2633 閱讀 6217

給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。

示例 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...