The challenge
Assume "#"
is like a backspace in string. This means that string "a#bc#d"
actually is "bd"
Your task is to process a string with "#"
symbols.
Examples
"abc#d##c" ==> "ac"
"abc##d######" ==> ""
"#######" ==> ""
"" ==> ""
Test cases
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class SolutionTest {
@Test
public void testCleanString() {
final BackspacesInString bis = new BackspacesInString();
assertEquals("ac", bis.cleanString("abc#d##c"));
assertEquals("", bis.cleanString("abc####d##c#"));
}
}
The solution in Java
Option 1:
public class BackspacesInString {
public String cleanString(String s) {
StringBuilder current = new StringBuilder("");
int idx = 0;
for (int i=0; i<s.length(); i++) {
String c = Character.toString(s.charAt(i));
if (c.equals("#")) {
// backspace
if (idx>0) {
idx--;
current.deleteCharAt(idx);
}
} else {
// string
System.out.println(c);
current.append(c);
idx++;
}
}
return current.toString();
}
}
Option 2 (using regex
):
class BackspacesInString {
static String cleanString(String s) {
while (s.matches(".*#.*")) s = s.replaceFirst(".?#", "");
return s;
}
}
Option 3 (using substring
):
public class BackspacesInString {
public String cleanString(String s) {
int idx = s.indexOf("#");
return idx < 0 ? s : idx == 0 ? cleanString(s.substring(1)) : cleanString(s.substring(0, idx-1) + s.substring(idx+1));
}
}