题目:
Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character.
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”.
Note:
1 <= S.length <= 200
1 <= T.length <= 200
S and T only contain lowercase letters and ‘#’ characters.
思路分析:
题目要求我们比较经过了删除操作之后的字符串是否相等,换言之就是决定字符串中的每一个字符是否可以留在最终的字符串中,而当前字符是否能留在最终的字符串中取决于其后面的"#“数目,我们可以选择从后面遍历回头,统计每个字符后面的字符”#"的数目,当且仅当该字符后的“#”数目大于1的时候我们才选择删除(不保留)该字符
Python
def backspaceCompare(self, S: str, T: str) -> bool:
def F(S):
skip=0
for x in reversed(S):
if x==’#’:
skip+=1
elif skip:
skip-=1
else:
yield x
return all(x == y for x, y in itertools.zip_longest(F(S), F(T)))
C++
bool backspaceCompare(string S, string T) {
for (int i = S.length() - 1, j = T.length() - 1;;i–, j–){
for (int b = 0; i >= 0 && (b || S[i] == ‘#’); --i) b += S[i] == ‘#’ ? 1 : -1;
for (int b = 0; j >= 0 && (b || T[j] == ‘#’); --j) b += T[j] == ‘#’ ? 1 : -1;
if (i < 0 || j < 0 || S[i] != T[j]) return i == -1 && j == -1;
}
}