# 【LeetCode】 844. Backspace String Compare ## Description > Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character. > Note: 1 <= S.length <= 200 1 <= T.length <= 200 S and T only contain lowercase letters and '#' characters. > 給兩個字串S和T,回傳他們是否相同。#符號代表一個倒退字元(Backspace鍵)。 > 注意: > S和T長度都介於1到200 > S和T只會包含小寫字母和'#'符號。 ## Example: ``` 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 = "#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". ``` ## Solution * 這題如果只是要解題超級簡單,你慢慢硬爆也可以,但是我們要挑戰時間複雜度為`O(N)`和空間複雜度`O(1)`。 * 也就是說,不能有雙重for loop也不能產生額外的陣列去存新的字串來處理。 * 既然不能開額外的字串,那麼我們就要直接對原字串`S`和`T`處理。 * 我建議從尾巴往回看: * 優點是for的判斷式不會因為erase亂掉,且不用處理多餘的`#`。 * 缺點是要另外記錄現在有多少`#`還沒使用,以免在連續的`#`發生錯誤。 ### Code ```C++=1 class Solution { public: bool backspaceCompare(string S, string T) { int count = 0; for(int i = S.size() - 1; i >= 0; i--) if(S[i] == '#') { S.erase(S.begin() + i); count++; } else if(count > 0) { S.erase(S.begin() + i); count--; } count = 0; for(int i = T.size() - 1; i >= 0; i--) if(T[i] == '#') { T.erase(T.begin() + i); count++; } else if(count > 0) { T.erase(T.begin() + i); count--; } return S == T; } }; ``` ###### tags: `LeetCode` `C++`