對於每個位置的兩個數之間,都有四種選擇:加、減、乘、不填符號(這樣兩個數就連在一起構成乙個更大的數)。
我們可以構造乙個代數結構,使得不管下乙個位置的數是什麼,這個數後面填什麼符號,我們都能記錄前面已經計算過的字串的值。
這個代數結構是a + b × c。 a 是我們前面記錄過的字串表示式的值,b是我們當前搜尋到的數,c是b下乙個位置的數。
這樣,如果c後面的符號是+,則整個表示式的值可以用(a+b×c) + 1 × _ 來維護,a + b × c就是a變數的下乙個值,也就是我們當前已經
搜尋到的字串表示式的值,_是剩下的字串的值。a更新為 a+b×c, b更新為1;
同理,如果c後面的符號是-,則整個表示式的值可以用(a+b×c) + (-1) × _來維護。 a更新為a+b×c, b更新為-1;
如果c後面的符號是×,則整個表示式的值可以用a+(b×c)×_來維護。a還是a,b更新為b×c。
如果c後面不填符號,我們直接更新c為乙個更大的數: c = c × 10 + num[i] - '0';表示兩個數連起來成為乙個數。
我們可以在字串num的最後一位加上乙個'+',這樣有乙個好處,當我們搜尋到倒數第二個位置(加上『+』之前的最後乙個位置)時,我們只要看
a的值是否是target就行了,如果a的值是target,則我們可以存下來當前的方案path(path是乙個string型別的變數)。 這是因為如果最後一位是
'+',則當前的a被更新為a + b * c(上面分析過了),如果遍歷完了原num字串,這時的a就是最終的答案。
**如下:
typedef long long ll; // 中間結果可能爆int,需要long long來存
class solution
} else
if(num[u] == '0') }}
}vectoraddoperators(string num, int target)
};
282 給表示式新增運算子
題目描述 給定乙個僅包含數字 0 9 的字串和乙個目標值,在數字之間新增二元運算子 不是一元 或 返回所有能夠得到目標值的表示式。示例 1 輸入 num 123 target 6 輸出 1 2 3 123 示例 2 輸入 num 232 target 8 輸出 23 2 2 32 示例 3 輸入 n...
282 給表示式新增運算子
給定乙個僅包含數字 0 9 的字串 num 和乙個目標值整數 target 在 num 的數字之間新增 二元 運算子 不是一元 或 返回所有能夠得到目標值的表示式。import j a.util.arraylist import j a.util.list class solution return...
282給表示式新增運算子(遞迴回溯 困難)
1 題目描述 給定乙個僅包含數字 0 9 的字串和乙個目標值,在數字之間新增二元運算子 不是一元 或 返回所有能夠得到目標值的表示式。2 示例 輸入 num 123 target 6 輸出 1 2 3 1 2 3 3 題解 基本思想 遞迴回溯,暴力遍歷所有的可能性,時間複雜度o 4 n class ...