題目的意思大概是有兩個字符串,其中的#
表示退格鍵,讓比較最后兩個字符串是否相當。
很容易想到的思路就是用一個棧進行模擬這個過程,特別需要注意如果一個串是空串也是可以退格的。
但是很容易想到的另一個特性就是,前面的字符有可能被后面的退格符刪去,但是如果如果從后往前進行遍歷的話那么一個字符一旦保留就不會被刪除,我們比較兩個字符串保留下來的字符,一旦發現不相等就直接返回。
總體來講就是雙指針加逆序遍歷。
其實看到這個題我直接就想到雙指針加逆序遍歷了。但是昨天晚上也不知道是因為困了還是什么原因,寫了二十分鐘寫的都是錯的。關鍵是對刪除的過程理解的不夠深刻,我們得到的保留的下來的字符應該有兩個特征:
- 不是
#
- 后面沒有
#
來刪除它
抓住這兩個特征,如果有一個特征不滿足就要繼續刪除,直到刪除過程結束。
中午寫了一下直接過了,果然還是白天頭腦清晰一點。
class Solution {
public:bool backspaceCompare(string S, string T) {int i = S.size()-1; int j = T.size()-1;int iNum = 0, jNum = 0;while(i>=0 || j>=0){while(i>=0 && (S[i]=='#' || iNum > 0)){if(S[i] == '#') ++iNum;else --iNum;--i;}while(j>=0 && (T[j]=='#' || jNum > 0)){if(T[j] == '#') ++jNum;else --jNum;--j;}if(i<0 && j<0) return true;if(i<0 && j>=0 || i>=0 && j<0) return false;if(S[i] != T[j]) return false;--i; --j;}return true;}
};
看了一下題解,大概和題解寫的差不多,但是我在上面循環刪除部分寫的比題解稍微好一點,題解在最后的判斷寫的比我好。