https://leetcode.com/problems/backspace-string-compare/description/
Two Pointer
X. https://zhanghuimeng.github.io/post/leetcode-844-backspace-string-compare/
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
andT
only contain lowercase letters and'#'
characters.
Follow up:
- Can you solve it in
O(N)
time andO(1)
space?
When writing a character, it may or may not be part of the final string depending on how many backspace keystrokes occur in the future.
If instead we iterate through the string in reverse, then we will know how many backspace characters we have seen, and therefore whether the result includes our character.
Algorithm
Iterate through the string in reverse. If we see a backspace character, the next non-backspace character is skipped. If a character isn't skipped, it is part of the final answer.
https://leetcode.com/problems/backspace-string-compare/discuss/135603/C++JavaPython-4-lines-O(N)-time-and-O(1)-space
https://leetcode.com/articles/backspace-string-compare/
public boolean backspaceCompare(String S, String T) {
for (int i = S.length() - 1, j = T.length() - 1;; i--, j--) {
for (int b = 0; i >= 0 && (b > 0 || S.charAt(i) == '#'); --i) b += S.charAt(i) == '#' ? 1 : -1;
for (int b = 0; j >= 0 && (b > 0 || T.charAt(j) == '#'); --j) b += T.charAt(j) == '#' ? 1 : -1;
if (i < 0 || j < 0 || S.charAt(i) != T.charAt(j)) return i == -1 && j == -1;
}
}
public boolean backspaceCompare(String S, String T) {
int i = S.length() - 1, j = T.length() - 1;
while (true) {
for (int back = 0; i >= 0 && (back > 0 || S.charAt(i) == '#'); --i)
back += S.charAt(i) == '#' ? 1 : -1;
for (int back = 0; j >= 0 && (back > 0 || T.charAt(j) == '#'); --j)
back += T.charAt(j) == '#' ? 1 : -1;
if (i >= 0 && j >= 0 && S.charAt(i) == T.charAt(j)) {
i--; j--;
} else
return i == -1 && j == -1;
}
}
https://blog.csdn.net/qjh5606/article/details/81509282
bool backspaceCompare(string S, string T) {
int i = S.size() - 1, j = T.size() - 1, countA = 0, countB = 0;
while (i >= 0 || j >= 0) {
while (i >= 0 && (S[i] == '#' || countA > 0))
S[i--] == '#' ? countA++ : countA--;
while (j >= 0 && (T[j] == '#' || countB > 0))
T[j--] == '#' ? countB++ : countB--;
if (i < 0 || j < 0)
return i == j;
if (S[i--] != T[j--])
return false;
}
return i == j;
}
https://whutweihuan.github.io/2018/09/08/2018-9-8-blog_leetcode3/bool backspaceCompare(string S, string T) { int i = S.length() - 1, j = T.length() - 1; int skipS = 0, skipT = 0; while (i >= 0 || j >= 0){ while (i >= 0) { if (S[i] == '#') { skipS++; i--; } else if (skipS > 0) { skipS--; i--; } else { break; } } while (j >= 0) { if (T[j] == '#') { skipT++;j--; } else if (skipT > 0) { skipT--; j--; } else { break; } } if (i>=0 && j>=0 && S[i] != T[j]) { return false; } i--, j--; } return false; }https://leetcode.com/problems/backspace-string-compare/discuss/162827/Java-Two-Pointer-With-Explanation-beat-98
https://leetcode.com/articles/backspace-string-compare/
public boolean backspaceCompare(String S, String T) {
int i = S.length() - 1, j = T.length() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) { // While there may be chars in build(S) or build (T)
while (i >= 0) { // Find position of next possible char in build(S)
if (S.charAt(i) == '#') {
skipS++;
i--;
} else if (skipS > 0) {
skipS--;
i--;
} else
break;
}
while (j >= 0) { // Find position of next possible char in build(T)
if (T.charAt(j) == '#') {
skipT++;
j--;
} else if (skipT > 0) {
skipT--;
j--;
} else
break;
}
// If two actual characters are different
if (i >= 0 && j >= 0 && S.charAt(i) != T.charAt(j))
return false;
// If expecting to compare char vs nothing
if ((i >= 0) != (j >= 0))
return false;
i--;
j--;
}
return true;
}
public boolean backspaceCompare(String S, String T) {
return build(S).equals(build(T));
}
public String build(String S) {
Stack<Character> ans = new Stack();
for (char c : S.toCharArray()) {
if (c != '#')
ans.push(c);
else if (!ans.empty())
ans.pop();
}
return String.valueOf(ans);
}
X. https://zhanghuimeng.github.io/post/leetcode-844-backspace-string-compare/
bool backspaceCompare(string S, string T) { int topS = 0, topT = 0; for (int i = 0; i < S.length(); i++) { char c = S[i]; if (c == '#') { if (topS > 0) topS--; } else S[topS++] = c; } for (int i = 0; i < T.length(); i++) { char c = T[i]; if (c == '#') { if (topT > 0) topT--; } else T[topT++] = c; } if (topS != topT) return false; return S.substr(0, topS) == T.substr(0, topT); }