Given two strings S
and T
, return if they are equal when both are typed into empty text editors. #
means a backspace character.html
Example 1:git
Input: S = "ab#c", T = "ad#c" Output: true Explanation: Both S and T become "ac".
Example 2:github
Input: S = "ab##", T = "c#d#" Output: true Explanation: Both S and T become "".
Example 3:c#
Input: S = "a##c", T = "#a#c" Output: true Explanation: Both S and T become "c".
Example 4:函數
Input: S = "a#c", T = "b" Output: false Explanation: S becomes "c" while T becomes "b".
Note:spa
1 <= S.length <= 200
1 <= T.length <= 200
S
and T
only contain lowercase letters and '#'
characters.Follow up:指針
O(N)
time and O(1)
space?
這道題給了咱們兩個字符串,裏面可能會有井號符#,這個表示退格符,鍵盤上的退格鍵咱們應該都很熟悉吧,當字打錯了的時候,確定要點退格鍵來刪除的。固然也能夠連續點好幾下退格鍵,這樣就能夠連續刪除了,在例子2和3中,也確實能看到連續的井號符。題目搞懂了以後,就開始解題吧,博主最早想的方法就是對S和T串分別處理完退格操做後再進行比較,那麼就可使用一個子函數來進行字符串的退格處理,在子函數中,咱們新建一個結果 res 的空串,而後遍歷輸入字符串,當遇到退格符的時候,判斷若結果 res 不爲空,則將最後一個字母去掉;若遇到的是字母,則直接加入結果 res 中便可。這樣S和T串同時處理完了以後,再進行比較便可,參見代碼以下:code
解法一:htm
class Solution { public: bool backspaceCompare(string S, string T) { return helper(S) == helper(T); } string helper(string str) { string res = ""; for (char c : str) { if (c == '#') { if (!res.empty()) res.pop_back(); } else { res.push_back(c); } } return res; } };
咱們也能夠不使用單獨的子函數,而是直接用 for 循環來處理S和T串,固然原理都是同樣的,分別創建s和t的空串,而後進行退格操做,最後比較s和t串是否相等便可,參見代碼以下:blog
解法二:
class Solution { public: bool backspaceCompare(string S, string T) { string s = "", t = ""; for (char c : S) c == '#' ? s.size() > 0 ? s.pop_back() : void() : s.push_back(c); for (char c : T) c == '#' ? t.size() > 0 ? t.pop_back() : void() : t.push_back(c); return s == t; } };
這道題的 follow up 讓咱們使用常數級的空間複雜度,就是說不能新建空的字符串來保存處理以後的結果,那麼只能在遍歷的過程當中同時進行比較,只能使用雙指針同時遍歷S和T串了。咱們採用從後往前遍歷,由於退格是要刪除前面的字符,因此倒序遍歷要好一些。用變量i和j分別指向S和T串的最後一個字符的位置,而後還須要兩個變量 cnt1 和 cnt2 來分別記錄S和T串遍歷過程當中連續出現的井號的個數,由於在連續井號後,要連續刪除前面的字母,如何知道當前的字母是不是須要刪除,就要知道當前還沒處理的退格符的個數。好,如今進行 while 循環,條件是i和j至少有一個要大於等於0,而後對S串進行另外一個 while 循環,條件是當i大於等於0,且當前字符是井號,或者 cnt1 大於0,若當前字符是退格符,則 cnt1 自增1,不然 cnt1 自減1,而後i自減1,這樣就至關於跳過了當前的字符,不用進行比較。對T串也是作一樣的 while 循環處理。以後若i和j有一個小於0了,那麼能夠根據i和j是否相等的狀況進行返回。不然再看若S和T串當前的字母不相等,則返回 false,由於當前位置的退格符已經處理完了,剩下的字母是須要比較相等的,若不相等就能夠直接返回 false 了。最後當外層的 while 循環退出後,返回i和j是否相等,參見代碼以下:
解法三:
class Solution { public: bool backspaceCompare(string S, string T) { int i = (int)S.size() - 1, j = (int)T.size() - 1, cnt1 = 0, cnt2 = 0; while (i >= 0 || j >= 0) { while (i >= 0 && (S[i] == '#' || cnt1 > 0)) S[i--] == '#' ? ++cnt1 : --cnt1; while (j >= 0 && (T[j] == '#' || cnt2 > 0)) T[j--] == '#' ? ++cnt2 : --cnt2; if (i < 0 || j < 0) return i == j; if (S[i--] != T[j--]) return false; } return i == j; } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/844
參考資料:
https://leetcode.com/problems/backspace-string-compare/