一魚多吃 用stack來解 Backspace String Compare_Leetcode #844

更新於 發佈於 閱讀時間約 4 分鐘

這題的題目在這裡:

題目敘述

題目會給定兩個字串s,t,把裡面的井字號#視為鍵盤上的backspace,往前(往左方)吃掉最靠近的字元

請位最後全部依照規則處理完以後,s,t剩下的字串內容兩者是否相等?

例如:
s = "ab#c", t = "ad#c"


說明:
相等,s, t 依照規則操作完,最後都只剩下"ac"。


測試範例

Example 1:

Input: s = "ab#c", t = "ad#c"
Output: true
Explanation: Both s and t become "ac".

Example 2:

Input: s = "ab##", t = "c#d#"
Output: true
Explanation: Both s and t become "".

Example 3:

Input: s = "a#c", t = "b"
Output: false
Explanation: s becomes "c" while t becomes "b".

約束條件

  • 1 <= s.length, t.length <= 200
  • s and t only contain lowercase letters and '#' characters.

 

Follow up: Can you solve it in O(n) time and O(1) space?


演算法

基本上這一題和前一個系列題高度相似,換湯不換藥,核心觀念都是在考backspace往前吃字元的操作和對應的stack行為模擬

從左到右,依序掃描每個字元。

如果遇到普通字元直接推入stack

如果遇到井字號#相當於我們鍵盤上的backspace 往前吃字元的功能,從stack pop出頂端的元素。

最後,留在stack內部的字元,串接在一起轉成字串,字串s, 字串t兩兩比較是否相等就是答案囉!


程式碼

class Solution:
 def backspaceCompare(self, S: str, T: str) -> bool:
  
  stack_s, stack_t = [], []
  
  # --------------------------------------
  def final_string( stk, string ):
   
   for char in string:
    
    if char != '#':
# push new character into stack
     stk.append( char )
     
    elif stk:
     # pop last charachter from stack, as a result of backspace operation
     stk.pop()
     
   
   return ''.join(stk)
  
  # --------------------------------------
  
  return final_string( stack_s, S ) == final_string( stack_t, T )
  
  

複雜度分析

時間複雜度: O( m+n )
從頭到尾,每個字元檢查過一遍。

空間複雜度: O( m+n )
需要兩個stack,stack耗用空間最多和輸入字串長度一樣長。


關鍵知識點

在於理解並且活用stack 先進後出FILO的特質,來實作#井字號和普通字元的配對

記得回去複習 合法括號配對最長合法括號配對字串長度移除星號 這幾題,主要的原理是相通的。


Reference:

[1] Python/JS/Java/C++ O( n ) sol by stack. [w/ Comment] - Backspace String Compare - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給定我們一組十進位表示法的阿拉伯數字,要求我們把它轉換為對應的羅馬數字。
題目會給定我們一組羅馬數字,要求我們把它轉換為對應十進位表示法的阿拉伯數字。
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目會給我們一組定義好的Stack 堆疊的介面,要求底層用兩個或一個Queue來實現。 也就是說,要求我們用一個或兩個FIFO的Queues去實作出一個LIFO的Stack
題目會給我們一組定義好的Queue 佇列的介面,要求底層用兩個stack來實現。 也就是說,要求我們用兩個LIFO的stacks去實作出一個FIFO的Queue
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給定我們一組十進位表示法的阿拉伯數字,要求我們把它轉換為對應的羅馬數字。
題目會給定我們一組羅馬數字,要求我們把它轉換為對應十進位表示法的阿拉伯數字。
題目會給我們一個山形的輸入陣列,和目標值target,要求我們找出目標值所在的陣列索引。如果出現兩次,返回比較小的那一個,也就是比較靠左的那個索引值。 山形的意思就是說,從最左側到山頂最大值都是遞增,從山頂最大值到右側都是遞減。
題目會給我們一組定義好的Stack 堆疊的介面,要求底層用兩個或一個Queue來實現。 也就是說,要求我們用一個或兩個FIFO的Queues去實作出一個LIFO的Stack
題目會給我們一組定義好的Queue 佇列的介面,要求底層用兩個stack來實現。 也就是說,要求我們用兩個LIFO的stacks去實作出一個FIFO的Queue
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
不少自學雅思的考生聽從網路上找到的建言,把IELTS Speaking Part 2分門別被,讓相同類別,譬如說:人、地、時、事、物,的考題可以共用相同回答。這樣很好,可以練習臨場反應與活用能力。但是,光是限制在同一種類型的考題可以共用回答,這是畫地自限的做法。 終極的活學活用,可以讓不同類型的考
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
不少自學雅思的考生聽從網路上找到的建言,把IELTS Speaking Part 2分門別被,讓相同類別,譬如說:人、地、時、事、物,的考題可以共用相同回答。這樣很好,可以練習臨場反應與活用能力。但是,光是限制在同一種類型的考題可以共用回答,這是畫地自限的做法。 終極的活學活用,可以讓不同類型的考
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String