LeetCode.1047-重復刪除字符串中的所有相鄰重復項

這是小川的第389次更新泻云,第419篇原創(chuàng)

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第251題(順位題號是1047)。給定一個小寫字母的字符串S碟渺,重復刪除兩個相鄰且相等的字母惊窖。

我們在S上反復刪除,直到我們再也無法刪除摆昧。

在完成所有此類重復刪除后返回最后一個字符串。保證答案是獨一無二的蜒程。

例如:

輸入:"abbaca"
輸出:"ca"
說明:在"abbaca"中我們可以刪除"bb"绅你,因為字母相鄰且相等,這是唯一可能的移動昭躺。這一舉動的結果是字符串是"aaca"忌锯,其中只有"aa"是可能的,所以最后的字符串是"ca"窍仰。

注意

  • 1 <= S.length <= 20000

  • S僅由英文小寫字母組成汉规。

02 第一種解法

題目的意思是依次比較S中相鄰的兩個字母,如果相同驹吮,就刪除掉针史,組成一個新的字符串,繼續(xù)剛才的操作碟狞,直到最后S中沒有相鄰的重復的字母啄枕。

思路:定義一個布爾類型變量flag,控制上一次遍歷S中的字母時族沃,是否存在相鄰的重復字母频祝。使用兩層循環(huán),外層控制是否可以繼續(xù)刪除脆淹,內層遍歷S中相鄰的字母常空,如果相同就刪掉,這里采取截取字符串的方式來生成新的字符串盖溺,同時將flag改為true漓糙,以便繼續(xù)外層循環(huán)。

public String removeDuplicates(String S) {
    boolean flag = true;
    while (flag) {
        flag = false;
        int n = S.length()-1;
        for (int i=0; i<n; i++) {
            if (S.charAt(i) == S.charAt(i+1)) {
                S = S.substring(0, i)+
                        S.substring(i+2, S.length());
                flag = true;
                break;
            }
        }
    }
    return S;
}


03 第二種解法

我們還可以借助來實現(xiàn)烘嘱,借助其后進先出的特性昆禽。

思路:遍歷S中的字母蝗蛙,如果當前字母和棧頂?shù)淖帜赶嗟龋蛯m數(shù)淖帜敢瞥肀睿绻幌嗟燃窆瑁蛪喝霔m敚钡奖闅v完所有字母盗棵。最后將棧中的字母拼接到StringBuilder中去壮韭,轉為字符串時,要反轉漾根,因為最先出棧的字母是S中較后面的泰涂。

public String removeDuplicates2(String S) {
    Stack<Character> stack = new Stack<Character>();
    int n = S.length();
    for (int i=0; i<n; i++) {
        if (!stack.isEmpty() && S.charAt(i) == stack.peek()) {
            stack.pop();
        } else {
            stack.push(S.charAt(i));
        }
    }
    StringBuilder sb = new StringBuilder();
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    return sb.reverse().toString();
}


04 第三種解法

同樣借助棧的思路鲫竞,但是我們可以不使用棧辐怕,通過StringBuilder來完成類似棧的操作。

思路:創(chuàng)建一個StringBuilder對象从绘,遍歷S中的字母寄疏,如果當前字母和StringBuilder中的最后一個字母相等,就將StringBuilder中的最后一個字母刪除僵井,否則就繼續(xù)往后拼接陕截。

public String removeDuplicates3(String S) {
    StringBuilder sb = new StringBuilder();
    int n = S.length();
    for (int i=0; i<n; i++) {
        int size = sb.length();
        if (size > 0 && sb.charAt(size-1) == S.charAt(i)) {
            sb.deleteCharAt(size-1);
        } else {
            sb.append(S.charAt(i));
        }
    }
    return sb.toString();
}


05 第四種解法

同樣借助棧的思路,我們還可以利用char數(shù)組來實現(xiàn)批什。

思路:創(chuàng)建一個長度和S相等的char數(shù)組农曲,遍歷S中的字母,如果當前字母和char數(shù)組中的最后一個字母相等驻债,就將索引前移乳规,下次再往char數(shù)組中添加元素時,就會根據(jù)新的索引重新賦值合呐,起到移除重復字母的效果暮的。

public String removeDuplicates4(String S) {
    int n = S.length(), index = 0;
    char[] arr = new char[n];
    for (int i=0; i<n; i++) {
        if (index > 0 && arr[index-1] == S.charAt(i)) {
            index--;
        } else {
            arr[index++] = S.charAt(i);
        }
    }
    return new String(arr, 0, index);
}


06 小結

算法專題目前已連續(xù)日更超過七個月,算法題文章257+篇淌实,公眾號對話框回復【數(shù)據(jù)結構與算法】冻辩、【算法】、【數(shù)據(jù)結構】中的任一關鍵詞拆祈,獲取系列文章合集恨闪。

以上就是全部內容,如果大家有什么好的解法思路放坏、建議或者其他問題咙咽,可以下方留言交流,點贊轻姿、留言犁珠、轉發(fā)就是對我最大的回報和支持逻炊!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市犁享,隨后出現(xiàn)的幾起案子余素,更是在濱河造成了極大的恐慌,老刑警劉巖炊昆,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桨吊,死亡現(xiàn)場離奇詭異,居然都是意外死亡凤巨,警方通過查閱死者的電腦和手機视乐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敢茁,“玉大人佑淀,你說我怎么就攤上這事≌妹剩” “怎么了伸刃?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逢倍。 經常有香客問我捧颅,道長,這世上最難降的妖魔是什么较雕? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任碉哑,我火速辦了婚禮,結果婚禮上亮蒋,老公的妹妹穿的比我還像新娘扣典。我一直安慰自己,他們只是感情好宛蚓,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布激捏。 她就那樣靜靜地躺著,像睡著了一般凄吏。 火紅的嫁衣襯著肌膚如雪远舅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天痕钢,我揣著相機與錄音图柏,去河邊找鬼。 笑死任连,一個胖子當著我的面吹牛蚤吹,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裁着,長吁一口氣:“原來是場噩夢啊……” “哼繁涂!你這毒婦竟也來了?” 一聲冷哼從身側響起二驰,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤扔罪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桶雀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矿酵,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年矗积,在試婚紗的時候發(fā)現(xiàn)自己被綠了全肮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡棘捣,死狀恐怖辜腺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情柱锹,我是刑警寧澤哪自,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布丰包,位于F島的核電站禁熏,受9級特大地震影響,放射性物質發(fā)生泄漏邑彪。R本人自食惡果不足惜瞧毙,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寄症。 院中可真熱鬧宙彪,春花似錦、人聲如沸有巧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篮迎。三九已至男图,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜橱,已是汗流浹背逊笆。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岂傲,地道東北人难裆。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乃戈。 傳聞我的和親對象是個殘疾皇子褂痰,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容