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

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

3月24日在廣州阿里巴巴頂樓,有一位孕婦拉出“強(qiáng)烈抗議阿里惡意非法解雇臨產(chǎn)孕婦”的條幅。一時(shí)間在網(wǎng)上鬧的沸沸揚(yáng)揚(yáng)。

隨后阿里巴巴發(fā)表情況說明:由于近期淘寶買菜廣州區(qū)域業(yè)務(wù)調(diào)整,部分崗位變化,其中涉及服務(wù)公司“仁勵(lì)窩人力資源服務(wù)(廣州)有限公司”的一位生態(tài)員工(待產(chǎn)期)。該員工并未被辭退,并根據(jù)相關(guān)法律規(guī)定,照常發(fā)放在崗工資。

我查了以下仁勵(lì)窩人力資源服務(wù)(廣州)有限公司,經(jīng)營(yíng)范圍包括人力資源服務(wù)(勞務(wù)派遣服務(wù)),并且股權(quán)結(jié)構(gòu)中沒有阿里巴巴,所以不是阿里巴巴的子公司,應(yīng)該是一家外包公司。

至于維權(quán),我覺得要看勞動(dòng)合同和誰簽,如果是和阿里簽的就去找阿里維權(quán),如果是和外包公司簽的,就應(yīng)該去找外包去維權(quán)。

而對(duì)于辭退孕婦這件事網(wǎng)友的評(píng)論也是兩極分化,有的說公司沒權(quán)利辭退孕婦,還有的說一懷孕就入職,一生完孩子就離職,也很讓人頭疼。

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

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

來看下今天的算法題,這題是LeetCode的第1209題:刪除字符串中的所有相鄰重復(fù)項(xiàng) II,難度是中等。

給你一個(gè)字符串 s,「k 倍重復(fù)項(xiàng)刪除操作」將會(huì)從 s 中選擇 k 個(gè)相鄰且相等的字母,并刪除它們,使被刪去的字符串的左側(cè)和右側(cè)連在一起。你需要對(duì) s 重復(fù)進(jìn)行無限次這樣的刪除操作,直到無法繼續(xù)為止。

在執(zhí)行完所有刪除操作后,返回最終得到的字符串。本題答案保證唯一。

示例1:

輸入:s = "abcd", k = 2 輸出:"abcd" 解釋:沒有要?jiǎng)h除的內(nèi)容。

示例2:

輸入:s = "deeedbbcccbdaa", k = 3 輸出:"aa" 解釋: 先刪除 "eee" 和 "ccc",得到 "ddbbbdaa" 再刪除 "bbb",得到 "dddaa" 最后刪除 "ddd",得到 "aa"

  • 1 <= s.length <= 10^5

  • 2 <= k <= 10^4

  • s 中只含有小寫英文字母。

問題分析

這題說的是如果有 k 個(gè)連續(xù)且相同的字符,就把它們給刪除。如果只是刪除相鄰且相同的字符我們可以直接使用一個(gè)棧就能解決,但這里還需要 k 個(gè)連續(xù)的,所以我們還需要在使用一個(gè)棧來記錄相鄰且相同元素的個(gè)數(shù)。

使用一個(gè)棧stk1來記錄所有的字符,相鄰且相同的字符只記錄一次,使用另外一個(gè)棧stk2來記錄該字符出現(xiàn)的次數(shù),當(dāng)出現(xiàn)的次數(shù)等于 k 的時(shí)候,就把該字符以及它出現(xiàn)的次數(shù)從兩個(gè)棧中移除。

最后還需要把棧中沒有移除的字符轉(zhuǎn)化為字符串即可。

JAVA:

public String removeDuplicates(String s, int k) {     Stack stk1 =  new Stack<>();// 記錄當(dāng)前字符     Stack stk2 =  new Stack<>();// 記錄當(dāng)前字符連續(xù)的個(gè)數(shù)     for (char ch : s.toCharArray()) {         if (!stk1.isEmpty() && ch == stk1.peek()) {             // 如果當(dāng)前字符和棧頂字符一樣,就統(tǒng)計(jì)棧頂字符連續(xù)的個(gè)數(shù)             stk2.push(stk2.pop() + 1);             if (stk2.peek() == k) {// 連續(xù)出現(xiàn)k個(gè),移除。                 stk1.pop();                 stk2.pop();             }         } else {             stk1.push(ch);             stk2.push(1);         }     }     StringBuilder ans = new StringBuilder();     while (!stk2.isEmpty()) {         char ch = stk1.pop();         int cnt = stk2.pop();// 當(dāng)前字符出現(xiàn)的個(gè)數(shù)         while (cnt-- > 0)             ans.append(ch);     }     return ans.reverse().toString(); }

C++:

public:     string removeDuplicates(string s, int k) {         stack

 stk1;// 記錄當(dāng)前字符         stack

 stk2;// 記錄當(dāng)前字符連續(xù)的個(gè)數(shù)         for (char ch: s) {             if (!stk1.empty() && ch == stk1.top()) {                 // 如果當(dāng)前字符和棧頂字符一樣,就統(tǒng)計(jì)棧頂字符連續(xù)的個(gè)數(shù)                 int cnt = stk2.top();                 stk2.pop();                 stk2.push(cnt + 1);                 if (stk2.top() == k) {// 連續(xù)出現(xiàn)k個(gè),移除。                     stk1.pop();                     stk2.pop();                 }             } else {                 stk1.push(ch);                 stk2.push(1);             }         }         string ans;         while (!stk2.empty()) {             char ch = stk1.top();             int cnt = stk2.top();// 當(dāng)前字符出現(xiàn)的個(gè)數(shù)             stk1.pop();             stk2.pop();             while (cnt-- > 0)                 ans += ch;         }         reverse(ans.begin(), ans.end());         return ans;     }

筆者簡(jiǎn)介

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