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」, t = 「#a#c」
輸出:true
解釋:s 和 t 都會變成 「c」。
示例 4:
輸入:s = 「a#c」, t = 「b」
輸出:false
解釋:s 會變成 「c」,但 t 仍然是 「b」。
高階:你可以用 o(n) 的時間複雜度和 o(1) 的空間複雜度解決該問題嗎?
最容易想到的方法是將給定的字串中的退格符和應當被刪除的字元都去除,還原給定字串的一般形式。然後直接比較兩字串是否相等即可。
具體地,我們用棧處理遍歷過程,每次我們遍歷到乙個字元:
如果它是退格符,那麼我們將棧頂彈出;
如果它是普通字元,那麼我們將其壓入棧中。
class
solution
public string build
(string str)
// 如果是普通字元則入棧
}else
}return sb.
tostring();}}
複雜度分析時間複雜度:o(n+m),其中 n 和 m 分別為字串 s 和 t 的長度。我們需要遍歷兩字串各一次。
空間複雜度:o(n+m),其中 n 和 m 分別為字串 s 和 t 的長度。主要為還原出的字串的開銷。
這裡空間複雜度不滿足要求,需要進一步優化
思路及演算法
乙個字元是否會被刪掉,只取決於該字元後面的退格符,而與該字元前面的退格符無關。因此當我們逆序地遍歷字串,就可以立即確定當前字元是否會被刪掉。
具體地,我們定義skip 表示當前待刪除的字元的數量。每次我們遍歷到乙個字元:
若該字元為退格符,則我們需要多刪除乙個普通字元,我們讓 skip 加 11;
這樣,我們定義兩個指標,分別指向兩字串的末尾。每次我們讓兩指標逆序地遍歷兩字串,直到兩字串能夠各自確定乙個字元,然後將這兩個字元進行比較。重複這一過程直到找到的兩個字元不相等,或遍歷完字串為止。
}// t串遍歷到沒有退格的字元
while
(j >=0)
else
if(skipt >0)
else
}// 如果兩個都沒有遍歷結束並且字元不相等則返回錯誤
if(i >=
0&& j >=0)
// 如果有乙個還沒遍歷結束,則不相等
}else
if(i >=
0|| j >=0)
// 向前遍歷
i--; j--;}
return
true
;}
844 比較含退格的字串 雙指標
844.比較含退格的字串 author wsq date 2020 10 19 給定 s 和 t 兩個字串,當它們分別被輸入到空白的文字編輯器後,判斷二者是否相等,並返回結果。代表退格字元。注意 如果對空文字輸入退格字元,文字繼續為空。示例 1 輸入 s ab c t ad c 輸出 true 解釋...
844 比較含退格的字串
給定 s 和 t 兩個字串,當它們分別被輸入到空白的文字編輯器後,判斷二者是否相等,並返回結果。代表退格字元。示例 1 輸入 s ab c t ad c 輸出 true 解釋 s 和 t 都會變成 ac 示例 2 輸入 s ab t c d 輸出 true 解釋 s 和 t 都會變成 示例 3 輸入...
844 比較含退格的字串
1 棧的思想,stack的大小用size,string的大小用length 2 要注意在遇到字元 號時不要直接彈出棧的元素,要先判斷棧中是否存在元素,若不存在還彈出元素將會發生記憶體問題 3 退格的意思 class solution else stk1.push s i for int j 0 je...