棧的最簡(jiǎn)應(yīng)用:leetcode #1544之整理字符串

什么是棧?

棧是大家很熟悉的一種數(shù)據(jù)結(jié)構(gòu)了舔箭,人們之所以使用棧罩缴,就是為了使用其后進(jìn)先出的特性。入棧出棧是棧的兩個(gè)靈魂操作层扶。

如圖所示箫章,以Python中的list模擬棧結(jié)構(gòu),原始list是[1,2]镜会,通過兩次push()操作檬寂,我們先后將3,4這兩個(gè)元素加入到list中,這個(gè)操作被稱作壓棧戳表,之后我們?cè)賹?duì)list施加兩次pop()操作來模擬出棧桶至,值得注意的是,元素4雖然是最后被壓棧的元素扒袖,但卻是第一個(gè)出棧的元素塞茅,這就是我們所說棧結(jié)構(gòu)的后進(jìn)先出的特性。

棧的操作.png

leetcode #1544之整理字符串

原題如下:

給你一個(gè)由大小寫英文字母組成的字符串s季率。
一個(gè)整理好的字符串中野瘦,兩個(gè)相鄰字符s[i]s[i+1],其中0<= i <= s.length-2,要滿足如下條件:
s[i]是小寫字符鞭光,則s[i+1]不可以是相同的大寫字符吏廉。
s[i]是大寫字符,則s[i+1]不可以是相同的小寫字符惰许。
請(qǐng)你將字符串整理好席覆,每次你都可以從字符串中選出滿足上述條件的兩個(gè)相鄰字符并刪除,直到字符串整理好為止汹买。

效果如下:

輸入:s = "leEeetcode"
輸出:"leetcode"
解釋:無論你第一次選的是 i = 1 還是 i = 2佩伤,都會(huì)使 "leEeetcode" 縮減為 "leetcode" 。

思路

我們可以維護(hù)一個(gè)listr來作為處理后的字符串的緩存晦毙,并且從頭至尾遍歷原始字符串s生巡,考慮如下兩種情況:

  1. 如果當(dāng)前遍歷到的字符cr中的最后一個(gè)元素互為大小寫,那么按照題意见妒,我們將同時(shí)舍棄這個(gè)元素c孤荣,以及r中的最后一個(gè)元素。刪除r中的最后一個(gè)元素须揣,就對(duì)應(yīng)著上述的出棧動(dòng)作盐股,可以用pop()方法來實(shí)現(xiàn)。
  2. 如果當(dāng)前遍歷到的字符cr中的最后一個(gè)元素沒有大小寫關(guān)系耻卡,或者r尚為空疯汁,那么直接把當(dāng)前字符c插入到r中,作為r的最后一個(gè)元素就可以了劲赠,對(duì)應(yīng)著上述壓棧的操作涛目。

經(jīng)過上述的循環(huán)操作,就可以得到一個(gè)按題意處理過的字符串了凛澎。

其他小的知識(shí)點(diǎn)

在編寫最終程序前霹肝,考慮本例中用到的幾個(gè)小的實(shí)現(xiàn)方式。

  1. Python如何新建一個(gè)list塑煎?
    可以用r = []r = list()兩種方式表示
  2. 如何判斷兩個(gè)字符互為大小寫沫换?
    兩個(gè)字符互為大小寫,意味著如果我們把兩個(gè)字符都轉(zhuǎn)成小寫(或大寫)來比較的話最铁,二者是相等的讯赏;并且把這兩個(gè)原始字符直接進(jìn)行比較的話,二者是不相等的:c1.lower() == c2.lower() and c1 != c2
  3. Python如何訪問list的最后一個(gè)元素冷尉?
    -1作為索引漱挎,可以訪問list中的最后一個(gè)元素:r[-1]
  4. Python如何向list末尾插入一個(gè)元素,以及從末尾刪除一個(gè)元素雀哨?
    append(c)向list尾部插入一個(gè)元素磕谅,用pop()從list尾部刪除一個(gè)元素私爷。
  5. Python如何將字符數(shù)組組合成字符串?
    使用join()函數(shù)膊夹,形式為str.join()衬浑。這里的str意指連接分隔符。例如'-'.join(['a','b','c'])的結(jié)果是a-b-c放刨,''.join(['a','b','c'])的結(jié)果是abc工秩。

Python實(shí)現(xiàn)的源碼

class Solution:
    def makeGood(self, s: str) -> str:
        # 新建一個(gè)list作為返回值的棧
        r = list()
        # 遍歷原始字符串
        for ch in s:
            # 如果當(dāng)前字符ch和r中的最后一個(gè)字符互為大小寫,那么需要?jiǎng)h除r中的最后一個(gè)元素
            if r and r[-1].lower() == ch.lower() and r[-1] != ch:
                r.pop()
            # 否則將當(dāng)前字符ch入棧
            else:
                r.append(ch) 
        # 將r中的元素組合成字符串返回
        return ''.join(r)

時(shí)間復(fù)雜度

很明顯进统,時(shí)間復(fù)雜度與原始字符串s的長(zhǎng)度相關(guān)助币,對(duì)于s中每個(gè)字符的操作時(shí)間都是常量級(jí)的,因此時(shí)間復(fù)雜度為O(n)麻昼。

如果您覺得這篇文章對(duì)您有用奠支,請(qǐng)不吝點(diǎn)贊和打賞哦馋辈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抚芦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迈螟,更是在濱河造成了極大的恐慌叉抡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答毫,死亡現(xiàn)場(chǎng)離奇詭異褥民,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洗搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門消返,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘拇,你說我怎么就攤上這事撵颊。” “怎么了惫叛?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵倡勇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嘉涌,道長(zhǎng)妻熊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任仑最,我火速辦了婚禮扔役,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘警医。我一直安慰自己亿胸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著损敷,像睡著了一般葫笼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拗馒,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天路星,我揣著相機(jī)與錄音,去河邊找鬼诱桂。 笑死洋丐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挥等。 我是一名探鬼主播友绝,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肝劲!你這毒婦竟也來了迁客?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辞槐,失蹤者是張志新(化名)和其女友劉穎掷漱,沒想到半個(gè)月后腊凶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄匕,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年行楞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹿榜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片海雪。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舱殿,靈堂內(nèi)的尸體忽然破棺而出奥裸,到底是詐尸還是另有隱情,我是刑警寧澤怀薛,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布刺彩,位于F島的核電站,受9級(jí)特大地震影響枝恋,放射性物質(zhì)發(fā)生泄漏创倔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一焚碌、第九天 我趴在偏房一處隱蔽的房頂上張望畦攘。 院中可真熱鬧,春花似錦十电、人聲如沸知押。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台盯。三九已至罢绽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間静盅,已是汗流浹背良价。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒿叠,地道東北人明垢。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像市咽,于是被迫代替她去往敵國(guó)和親痊银。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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