leetcode 844 比較含退格的字串
力扣 844 比較含退格的字串 | leetcode 844 backspace string compare | 算盡天下系列第 11 期 | 棧/雙指標
給定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」, t = 「#a#c」
輸出:true
解釋:s 和 t 都會變成 「c」。
示例 4:
輸入:s = 「a#c」, t = 「b」
輸出:false
解釋:s 會變成 「c」,但 t 仍然是 「b」。
棧雙指標
這道題可以用乙個棧來模擬退格的操作,遍歷字串,遇到新字元就入棧,遇到退格鍵就出棧,最後比較兩個棧內的元素是否相等,非常簡單。
但是如果要求只使用 o(1) 的空間呢?這道題的難度一下子就可以上公升好幾個數量級。
下面分享一種使用雙指標來完成這道題的方法,只需要使用 o(1) 的輔助空間。
從前往後遍歷字串的時候,遇到乙個字元,我們是沒有辦法知道這個字元最終會不會屬於這個字串,因為我們沒有辦法知道後面會有多少個退格,但是從後往前遍歷字串的時候,我們有辦法知道乙個字元是不是屬於這個字串。
那麼,我們可以從後往前遍歷字串,記i
和j
分別表示當前兩個字串的比較位置,初始均為strlen() - 1
。
若當前位置的字元不相等(s[i] != t[j]
),則直接return false
而無需繼續往前比較,若當前位置的字元相等,那麼繼續往前比較。
現在還需要處理乙個退格的問題。
若遇到s[i] == '#'
,那麼就要數一數有多少個退格鍵,每遇到乙個退格鍵,skips++
,表示接下來要跳過多少個字元。那麼,當skips > 0
時,我們依舊需要持續地令i--; skips--;
,不斷的跳過那些被刪除了的字元。
需要注意的有兩點:一,在這個過程中,s[i]
依舊有可能等於'#'
,此時我們非但不應該進行skips--
,反而應該進行skips++
。二,在退格操作完成後,緊接著的那個字元也有可能是'#'
,因此退格操作應持續進行到s[i] != '#'
為止。
對於t
也是一樣的。
只要i
和j
中有任何乙個還大於 0,就應該持續該過程,直到兩者都小於 0,此時輸出true
。
由於字串長度可能不等,退格鍵的按下次數可能會超過已經輸入的字元數,例如a###########b
,所以應該時刻注意上面所有的條件判斷中要加上i >= 0
和j >= 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...