Problem

Given two strings s and t, return true if they are equal when both are typed into empty text editors'#' means a backspace character.

Note that after backspacing an empty text, the text will continue empty.

Examples

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 = "b"
Output: false
Explanation: s becomes "c" while t becomes "b".

Solution

Method 1 - Iterative From End of String

Backspace # affects the string, for eg. ab## becomes "". When we move from left to right in string, say with iterator index i, and if we encounter #, we have to come back.

What if traverse backwards. Whenever we encounter #, we skip some chars, depending on number of # we encountered. Otherwise, we will just compare 2 strings.

Code

Java
public boolean backspaceCompare(String s, String t) {
	int i = s.length() - 1, j = t.length() - 1;
	int skipS = 0, skipT = 0;

	// While there may be chars in build(s) or build (t)
	while (i >= 0 || j >= 0) {
		// Find position of next possible char in build(s)
		while (i >= 0) {
			if (s.charAt(i) == '#') {
				skipS++;
				i--;
			} else if (skipS > 0) {
				skipS--;
				i--;
			} else {
				break;
			}
		}
		// Find position of next possible char in build(t)
		while (j >= 0) { 
			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 == -1)) || ((i == -1) && j >= 0)) {
			return false;
		}

		i--;
		j--;
	}

	return true;
}