javastring

Java codingbat help - withoutString


I'm using codingbat.com to get some java practice in. One of the String problems, 'withoutString' is as follows:

Given two strings, base and remove, return a version of the base string where all instances of the remove string have been removed (not case sensitive). You may assume that the remove string is length 1 or more. Remove only non-overlapping instances, so with "xxx" removing "xx" leaves "x". This problem can be found at: http://codingbat.com/prob/p192570

As you can see from the the dropbox-linked screenshot below, all of the runs pass except for three and a final one called "other tests." The thing is, even though they are marked as incorrect, my output matches exactly the expected output for the correct answer.

Here's a screenshot of my output:

Screenshot of my output

And here's the code I'm using:

public String withoutString(String base, String remove) { 
  String result = "";
  int i = 0;

  for(; i < base.length()-remove.length();){
    if(!(base.substring(i,i+remove.length()).equalsIgnoreCase(remove))){
      result = result + base.substring(i,i+1);
      i++;
    }
    else{
      i = i + remove.length();
    }
    if(result.startsWith(" ")) result = result.substring(1);
    if(result.endsWith(" ") && base.substring(i,i+1).equals(" ")) result = result.substring(0,result.length()-1); 
  }
  if(base.length()-i <= remove.length() && !(base.substring(i).equalsIgnoreCase(remove))){
      result = result + base.substring(i);
  }
  return result;
}

Solution

  • @Daemon

    your code works. Thanks for the regex explanation. Though dansalmo pointed out that codingbat is displaying the intended output incorrectly, I through in some extra lines to your code to unnecessarily account for the double spaces with the following:

    public String withoutString(String base, String remove){ 
      String result = base.replaceAll("(?i)" + remove, "");
    
      for(int i = 0; i < result.length()-1;){
        if(result.substring(i,i+2).equals("  ")){
          result = result.replace(result.substring(i,i+2), " ");
        }
        else i++;
      }
    
      if(result.startsWith(" ")) result = result.substring(1);
      return result;
    }