LeetCode 844 比較含退格的字串

2021-10-04 21:17:51 字數 2789 閱讀 9150

leetcode 844 比較含退格的字串

力扣 844 比較含退格的字串 | leetcode 844 backspace string compare | 算盡天下系列第 11 期 | 棧/雙指標

給定st兩個字串,當它們分別被輸入到空白的文字編輯器後,判斷二者是否相等,並返回結果。#代表退格字元。

示例 1:

輸入:s = 「ab#c」, t = 「ad#c」

輸出:true

解釋:s 和 t 都會變成 「ac」。

示例 2:

輸入:s = 「ab##」, t = 「c#d#」

輸出:true

解釋:s 和 t 都會變成 「」。

示例 3:

輸入:s = 「a##c」, t = 「#a#c」

輸出:true

解釋:s 和 t 都會變成 「c」。

示例 4:

輸入:s = 「a#c」, t = 「b」

輸出:false

解釋:s 會變成 「c」,但 t 仍然是 「b」。

棧雙指標

這道題可以用乙個棧來模擬退格的操作,遍歷字串,遇到新字元就入棧,遇到退格鍵就出棧,最後比較兩個棧內的元素是否相等,非常簡單。

但是如果要求只使用 o(1) 的空間呢?這道題的難度一下子就可以上公升好幾個數量級。

下面分享一種使用雙指標來完成這道題的方法,只需要使用 o(1) 的輔助空間。

從前往後遍歷字串的時候,遇到乙個字元,我們是沒有辦法知道這個字元最終會不會屬於這個字串,因為我們沒有辦法知道後面會有多少個退格,但是從後往前遍歷字串的時候,我們有辦法知道乙個字元是不是屬於這個字串。

那麼,我們可以從後往前遍歷字串,記ij分別表示當前兩個字串的比較位置,初始均為strlen() - 1

若當前位置的字元不相等(s[i] != t[j]),則直接return false而無需繼續往前比較,若當前位置的字元相等,那麼繼續往前比較。

現在還需要處理乙個退格的問題。

若遇到s[i] == '#',那麼就要數一數有多少個退格鍵,每遇到乙個退格鍵,skips++,表示接下來要跳過多少個字元。那麼,當skips > 0時,我們依舊需要持續地令i--; skips--;,不斷的跳過那些被刪除了的字元。

需要注意的有兩點:一,在這個過程中,s[i]依舊有可能等於'#',此時我們非但不應該進行skips--,反而應該進行skips++。二,在退格操作完成後,緊接著的那個字元也有可能是'#',因此退格操作應持續進行到s[i] != '#'為止。

對於t也是一樣的。

只要ij中有任何乙個還大於 0,就應該持續該過程,直到兩者都小於 0,此時輸出true

由於字串長度可能不等,退格鍵的按下次數可能會超過已經輸入的字元數,例如a###########b,所以應該時刻注意上面所有的條件判斷中要加上i >= 0j >= 0的判斷。

這樣,在上面過程中的任何一處出現(i >= 0 && j < 0)或者(i < 0 && j >= 0)都將是不合法的。

bool backspacecompare

(char

* s,

char

* t)

while

(i >=

0&& skips >0)

else

i--;}

}while

(j >=

0&& t[j]

=='#'

)while

(j >=

0&& skipt >0)

else

j--;}

}if(i >=

0&& j >=0)

else

}else

}return true;

}

官方的題解會更簡潔一些:

class

solution

else

if(skips >0)

else

break;}

while

(j >=0)

else

if(skipt >0)

else

break;}

// if two actual characters are different

if(i >=

0&& j >=

0&& s.

charat

(i)!= t.

charat

(j))

return

false

;// if expecting to compare char vs nothingif(

(i >=0)

!=(j >=0)

)return

false

; i--

; j--;}

return

true;}

}

leetcode 844 比較含退格的字串

給定s和t兩個字串,當它們分別被輸入到空白的文字編輯器後,判斷二者是否相等,並返回結果。代表退格字元。示例 1 輸入 s ab c t ad c 輸出 true解釋 s 和 t 都會變成 ac 示例 2 輸入 s ab t c d 輸出 true解釋 s 和 t 都會變成 示例 3 輸入 s a c...

leetcode 844 比較含退格的字串

近期一直在用python刷leetcode的題,都提交到了github上了 給定s和t兩個字串,當它們分別被輸入到空白的文字編輯器後,判斷二者是否相等,並返回結果。代表退格字元。示例 1 輸入 s ab c t ad c 輸出 true 解釋 s 和 t 都會變成 ac 示例 2 輸入 s ab t...

LeetCode 844 比較含退格的字串

輸入 s ab c t ad c 輸出 true 解釋 s 和 t 都會變成 ac 示例 2 輸入 s ab t c d 輸出 true 解釋 s 和 t 都會變成 示例 3 輸入 s a c t a c 輸出 true 解釋 s 和 t 都會變成 c 示例 4 輸入 s a c t b 輸出 fa...