The challenge
In this challenge you are given a string for example:
"example(unwanted thing)example"
Your task is to remove everything inside the parentheses as well as the parentheses themselves.
The example above would return:
"exampleexample"
Notes
- Other than parentheses only letters and spaces can occur in the string. Don’t worry about other brackets like
"[]"
and"{}"
as these will never appear. - There can be multiple parentheses.
- The parentheses can be nested.
The solution in Java code
Option 1:
public class Solution {
public static String removeParentheses(final String str) {
String updated = str.replaceAll("\\([^()]*\\)", "");
if (updated.contains("(")) updated = removeParentheses(updated);
return updated;
}
}
Option 2:
public class Solution {
public static String removeParentheses(final String str) {
String res = "";
int count = 0;
for (int l = 0; l < str.length(); l++) {
char c = str.charAt(l);
if (c == '(') count += 1;
if (count == 0) res += str.charAt(l);
if (c == ')') count -= 1;
}
return res;
}
}
Option 3:
public class Solution {
public static String removeParentheses(final String str) {
String result = str;
while (result.contains("(")) {
result = result.replaceAll("\\([^()]*\\)", "");
}
return result;
}
}
Test cases to validate our solution
import org.junit.Test;
import java.util.*;
import java.util.stream.*;
public class SolutionTest {
@Test
public void fixedTests() {
for (String[] trial : new String[][]{
{"example(unwanted thing)example", "exampleexample"},
{"example(unwanted thing)example", "exampleexample"},
{"example (unwanted thing) example", "example example"},
{"a (bc d)e", "a e"},
{"a(b(c))", "a"},
{"hello example (words(more words) here) something", "hello example something"},
{"(first group) (second group) (third group)", " "}})
Tester.doTest(trial[0], trial[1]);
}
private static final String letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
private static final Random rand = new Random();
private static String randomLetter() {
int i = rand.nextInt(letters.length());
return letters.substring(i, i+1);
}
@Test
public void randomTests() {
for (int trial = 1; trial <= 100; trial++) {
String str = IntStream.range(0, rand.nextInt(200)+2)
.mapToObj(i -> randomLetter())
.collect(Collectors.joining(""));
for (int parens = rand.nextInt(str.length()/2); 0 < parens--;) {
int open = rand.nextInt(str.length()-1), close = rand.nextInt(str.length()-open) + open;
str = str.substring(0, open) + "(" + str.substring(open, close) + ")" + str.substring(close);
}
Tester.doTest(str, solution(str));
}
}
private String solution(final String str) {
StringBuilder sb = new StringBuilder();
int depth = 0;
for (char c : str.toCharArray()) {
depth += '(' == c ? 1 : 0;
if ( 0 == depth ) sb.append(c);
depth -= ')' == c ? 1 : 0;
}
return sb.toString();
}
}