專欄:50多種數(shù)據(jù)結(jié)構(gòu)徹底征服

專欄:50多種經(jīng)典圖論算法全部掌握

現(xiàn)在是3月份,正是找工作的時候,大家不要被一些所謂的高薪工作給迷惑了,尤其是國外的工作,如果是國企外派過去的倒還好一些,如果是自己在網(wǎng)上找的,一定要謹(jǐn)慎。

最近網(wǎng)上有三人收到一條短信,大致內(nèi)容是給他們提供一份工作,工作內(nèi)容是剪輯和拍攝,一個月賺七八萬,五六十萬的都有。雖然他們并無相關(guān)工作經(jīng)驗(yàn),仍按照對方指示來到廣西,企圖偷渡出境。幸好,出租車司機(jī)發(fā)現(xiàn)并報了警,民警及時把他們攔截。

我記得在2019年和2020年找工作的時候,也收到一些需要出國的工作,工資要比國內(nèi)高一些,一個是菲律賓一個是泰國,他們說這些國家軟件開發(fā)不行,需要國內(nèi)的人過去,我當(dāng)時沒考慮到是詐騙,但覺得太遠(yuǎn),直接拒絕了。還好沒去,印象中那幾年招人到東南亞的挺多的。

打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片

--------------下面是今天的算法題--------------

來看下今天的算法題,這題是LeetCode的第1249題:移除無效的括號,難度中等 。

給你一個由 '('、')' 和小寫字母組成的字符串 s。你需要從

示例1:

輸入:s = "lee(t(c)o)de)" 輸出:"lee(t(c)o)de" 解釋:"lee(t(co)de)" , "lee(t(c)ode)" 也是一個可行答案。

示例2:

輸入:s = "a)b(c)d" 輸出:"ab(c)d"

問題分析

這題說的是刪除最少的括號,使剩下的括號有效,其中字母不要刪除。實(shí)際上這是一道括號匹配問題,匹配的時候我們只需要考慮左括號和右括號,其它的字符不需要考慮。

我們使用一個棧只記錄

如果遇到右括號 ')' ,并且棧是空的,說明沒有和這個右括號匹配的左括號,把這個右括號標(biāo)記為可刪除狀態(tài)。如果棧不為空,那么當(dāng)前右括號就和棧頂?shù)淖罄ㄌ柺瞧ヅ涞模?a class="keyword-search" >棧頂的左括號出棧,把它們都標(biāo)記為不可刪除狀態(tài)。

最后在遍歷整個字符串,去掉刪除狀態(tài)的括號即可。

JAVA:

public String minRemoveToMakeValid(String s) {     boolean[] deleted = newboolean[s.length()];// 標(biāo)記哪些括號是被刪除的     Stack stk =  new Stack<>();     for (int i = 0; i < s.length(); i++) {         if (s.charAt(i) == '(') {             // 左括號,先標(biāo)記為刪除狀態(tài),如果能遇到右括號,再標(biāo)記為不可刪除狀態(tài)。             stk.push(i);             deleted[i] = true;         } elseif (s.charAt(i) == ')') {             if (stk.empty()) {                 // 棧是空的,說明當(dāng)前右括號沒有可匹配的,標(biāo)記為刪除狀態(tài)。                 deleted[i] = true;             } else {                 // 這里的右括號和棧頂?shù)淖罄ㄌ柶ヅ?,?biāo)記為不可刪除狀態(tài)。                 deleted[stk.pop()] = false;                 deleted[i] = false;             }         }     }     // 去掉刪除狀態(tài)的字符。     StringBuilder ans = new StringBuilder();     for (int i = 0; i < s.length(); i++) {         if (!deleted[i])             ans.append(s.charAt(i));     }     return ans.toString(); }

C++:

public:     string minRemoveToMakeValid(string s) {         vector

  deleted(s.length(), false);// 標(biāo)記哪些括號是被刪除的         stack

 stk;         for (int i = 0; i < s.length(); i++) {             if (s[i] == '(') {                 // 左括號,先標(biāo)記為刪除狀態(tài),如果能遇到右括號,再標(biāo)記為不可刪除狀態(tài)。                 stk.push(i);                 deleted[i] = true;             } elseif (s[i] == ')') {                 if (stk.empty()) {                     // 棧是空的,說明當(dāng)前右括號沒有可匹配的,標(biāo)記為刪除狀態(tài)。                     deleted[i] = true;                 } else {                     // 這里的右括號和棧頂?shù)淖罄ㄌ柶ヅ?,?biāo)記為不可刪除狀態(tài)。                     deleted[stk.top()] = false;                     stk.pop();                     deleted[i] = false;                 }             }         }         // 去掉刪除狀態(tài)的字符。         string ans;         for (int i = 0; i < s.length(); i++) {             if (!deleted[i])                 ans += s[i];         }         return ans;     }

筆者簡介

博哥,真名:王一博,畢業(yè)十多年, 作者,專注于 數(shù)據(jù)結(jié)構(gòu)和算法 的講解,在全球30多個算法網(wǎng)站中累計做題2000多道,在公眾號中寫算法題解800多題,對算法題有自己獨(dú)特的解題思路和解題技巧,喜歡的可以給個關(guān)注,也可以 下載我整理的1000多頁的PDF算法文檔 。