241. 為運(yùn)算表達(dá)式設(shè)計(jì)優(yōu)先級(jí) : DFS 運(yùn)用題

題目描述

這是 LeetCode 上的 241. 為運(yùn)算表達(dá)式設(shè)計(jì)優(yōu)先級(jí) 碉渡,難度為 中等帆疟。

Tag : 「DFS」页衙、「爆搜」

給你一個(gè)由數(shù)字和運(yùn)算符組成的字符串 expression疯趟,按不同優(yōu)先級(jí)組合數(shù)字和運(yùn)算符,計(jì)算并返回所有可能組合的結(jié)果认然。你可以 按任意順序 返回答案卦尊。

生成的測(cè)試用例滿足其對(duì)應(yīng)輸出值符合 32 位整數(shù)范圍,不同結(jié)果的數(shù)量不超過(guò) 10^4 报亩。

示例 1:

輸入:expression = "2-1-1"

輸出:[0,2]

解釋:
((2-1)-1) = 0 
(2-(1-1)) = 2

示例 2:

輸入:expression = "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

提示:

  • 1 <= expression.length <= 20
  • expression 由數(shù)字和算符 '+'浴鸿、'-''*' 組成。
  • 輸入表達(dá)式中的所有整數(shù)值在范圍 [0, 99]

DFS

為了方便弦追,我們令 expressions岳链。

數(shù)據(jù)范圍為 20,且要統(tǒng)計(jì)所有的計(jì)算結(jié)果劲件,我們可以運(yùn)用 DFS 爆搜所有方案掸哑。

給定的 s 只有數(shù)字和運(yùn)算符,我們可以根據(jù)運(yùn)算符將式子分為左右兩部分零远,設(shè)計(jì)遞歸函數(shù) List<Integer> dfs(int l, int r)苗分,含義為搜索子串 s[l...r] 的所有運(yùn)算結(jié)果。

最終答案為 dfs(0,n-1)牵辣,其中 n 為入?yún)⒆址拈L(zhǎng)度摔癣,同時(shí)我們有顯而易見的遞歸出口:當(dāng)給定的 s[l...r] 不包含任何運(yùn)算符時(shí),搜索結(jié)果為 s[l...r] 所代表的數(shù)字本身。

考慮如何對(duì)任意 s[l...r] 進(jìn)行計(jì)算:我們可以通過(guò)枚舉 s[l...r] 范圍內(nèi)的所有的運(yùn)算符位置來(lái)進(jìn)行爆搜择浊,假設(shè)當(dāng)前枚舉到的 s[i] 為運(yùn)算符戴卜,我們可以遞歸運(yùn)算符的左邊 dfs(l,i-1) 拿到左邊所有的結(jié)果,遞歸運(yùn)算符右邊 dfs(i+1,r) 拿到右邊的所有結(jié)果琢岩,結(jié)合「乘法原理」即可知道以當(dāng)前運(yùn)算符 s[i] 為分割點(diǎn)的表達(dá)式的所有方案投剥。

不難發(fā)現(xiàn),上述過(guò)程都是由「小表達(dá)式」的結(jié)果推導(dǎo)出「大表達(dá)式」的結(jié)果担孔,因此也可以運(yùn)用「區(qū)間 DP」方式進(jìn)行求解江锨,復(fù)雜度與 DFS 一致。

代碼:

class Solution {
    char[] cs;
    public List<Integer> diffWaysToCompute(String s) {
        cs = s.toCharArray();
        return dfs(0, cs.length - 1);
    }
    List<Integer> dfs(int l, int r) {
        List<Integer> ans = new ArrayList<>();
        for (int i = l; i <= r; i++) {
            if (cs[i] >= '0' && cs[i] <= '9') continue;
            List<Integer> l1 = dfs(l, i - 1), l2 = dfs(i + 1, r);
            for (int a : l1) {
                for (int b : l2) {
                    int cur = 0;
                    if (cs[i] == '+') cur = a + b;
                    else if (cs[i] == '-') cur = a - b;
                    else cur = a * b;
                    ans.add(cur);
                }
            }
        }
        if (ans.isEmpty()) {
            int cur = 0;
            for (int i = l; i <= r; i++) cur = cur * 10 + (cs[i] - '0');
            ans.add(cur);
        }
        return ans;
    }
}
  • 時(shí)間復(fù)雜度:復(fù)雜度與最終結(jié)果數(shù)相關(guān)糕篇,最終結(jié)果數(shù)為「卡特蘭數(shù)」泳桦,復(fù)雜度為 O(C_{n})
  • 空間復(fù)雜度:復(fù)雜度與最終結(jié)果數(shù)相關(guān),最終結(jié)果數(shù)為「卡特蘭數(shù)」娩缰,復(fù)雜度為 O(C_{n})

最后

這是我們「刷穿 LeetCode」系列文章的第 No.241 篇灸撰,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目拼坎,部分是有鎖題浮毯,我們將先把所有不帶鎖的題目刷完。

在這個(gè)系列文章里面泰鸡,除了講解解題思路以外债蓝,還會(huì)盡可能給出最為簡(jiǎn)潔的代碼。如果涉及通解還會(huì)相應(yīng)的代碼模板盛龄。

為了方便各位同學(xué)能夠電腦上進(jìn)行調(diào)試和提交代碼饰迹,我建立了相關(guān)的倉(cāng)庫(kù):https://github.com/SharingSource/LogicStack-LeetCode

在倉(cāng)庫(kù)地址里余舶,你可以看到系列文章的題解鏈接啊鸭、系列文章的相應(yīng)代碼、LeetCode 原題鏈接和其他優(yōu)選題解匿值。

更多更全更熱門的「筆試/面試」相關(guān)資料可訪問(wèn)排版精美的 合集新基地 ????

本文由mdnice多平臺(tái)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赠制,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挟憔,更是在濱河造成了極大的恐慌钟些,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊谭,死亡現(xiàn)場(chǎng)離奇詭異政恍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)达传,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門篙耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)迫筑,“玉大人,你說(shuō)我怎么就攤上這事鹤树∠澈福” “怎么了逊朽?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵罕伯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我叽讳,道長(zhǎng)追他,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任岛蚤,我火速辦了婚禮邑狸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涤妒。我一直安慰自己单雾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布她紫。 她就那樣靜靜地躺著硅堆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贿讹。 梳的紋絲不亂的頭發(fā)上渐逃,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音民褂,去河邊找鬼茄菊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赊堪,可吹牛的內(nèi)容都是我干的面殖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哭廉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼畜普!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起群叶,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吃挑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后街立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舶衬,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年赎离,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逛犹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虽画,靈堂內(nèi)的尸體忽然破棺而出舞蔽,到底是詐尸還是另有隱情,我是刑警寧澤码撰,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布渗柿,位于F島的核電站,受9級(jí)特大地震影響脖岛,放射性物質(zhì)發(fā)生泄漏朵栖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一柴梆、第九天 我趴在偏房一處隱蔽的房頂上張望陨溅。 院中可真熱鬧,春花似錦绍在、人聲如沸门扇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臼寄。三九已至,卻和暖如春卸察,著一層夾襖步出監(jiān)牢的瞬間脯厨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工坑质, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合武,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓涡扼,卻偏偏與公主長(zhǎng)得像稼跳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吃沪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容