title: Compare strings using recursion
body: <p>I've got a homework assignment that I just can't figure out. I have to write a static method match(String x, String y) that returns a boolean for whether or not string x and string y match. The matching process should allow "wild cards" such as '@' character which will match with any single character and the '*' character which will match with 0 or more characters of any type. I'm not allowed to use any loops and I have to use recursion.
  What I've written so far is this...</p>
  
  <pre><code>public class CompareStrings {
  public static boolean match(String x, String y) {
      if (x.length() &lt;= 1 &amp;&amp; y.length() &lt;= 1) {
          if (x.equals("*") || y.equals("*")) {
              return true;
          }
          if ((x.length() == 1 &amp;&amp; y.length() == 1) &amp;&amp; (x.equals("@") || y.equals("@"))) {
              return true;
          }
          return  x.equals(y);
      }
      String x1 = "";
      String x2 = "";
      String y1 = "";
      String y2 = "";
      if (x.length() == 0 &amp;&amp; y.charAt(0) == '*') {
              y2 = y.substring(1, y.length());
      }
      if (y.length() == 0 &amp;&amp; x.charAt(0) == '*') {
              x2 = x.substring(1, x.length());
      }
      if (x.length() &gt; 1 &amp;&amp; y.length() &gt; 1) {
          if (x.length() != y.length() &amp;&amp; !x.contains("*") &amp;&amp; !y.contains("*")) {
              return false;
          }
          if (x.charAt(0) == '*') {
              x1 = "*";
              x2 = x.substring(1, x.length());
              y1 = "*";
              y2 = y.substring(y.length()-x2.length(), y.length());
          }
          else if (y.charAt(0) == '*') {
              y1 = "*";
              y2 = y.substring(1, y.length());
              x1 = "*";
              x2 = x.substring(x.length()-y2.length(), x.length());
          }
          else {
              x1 = x.substring(0, 1);
              x2 = x.substring(1, x.length());
              y1 = y.substring(0, 1);
              y2 = y.substring(1, y.length());
          }
      }
      return match(x1, y1) &amp;&amp; match(x2, y2);
  }
  
  public static void main(String[] args) {
      System.out.println(match("hello", "hello.") + " 1 false"); // should return false
      System.out.println(match("hello", "jello") + " 2 false"); // should return false
      System.out.println(match("hello", "h@llo") + " 3 true"); // should return true
      System.out.println(match("hello", "h@@@@") + " 4 true"); // should return true
      System.out.println(match("hello", "h*") + " 5 true"); // should return true
      System.out.println(match("hello", "*l*") + " 6 true"); // should return true
      System.out.println(match("anyString", "*") + " 7 true"); // should return true
      System.out.println(match("help", "h@@@@") + " 8 false"); // should return false
      System.out.println(match("help", "h*") + " 9 true"); // should return true
      System.out.println(match("help", "*l*") + " 10 true"); // should return true
      System.out.println(match("help", "*l*p") + " 11 true"); // should return true
      System.out.println(match("help", "h@llo") + " 12 false"); // should return false
      System.out.println(match("", "*") + " 13 true"); // should return true
      System.out.println(match("", "***") + " 14 true"); // should return true
      System.out.println(match("", "@") + " 15 false"); // should return false
      System.out.println(match("", "") + " 16 true"); // should return true
  }
  </code></pre>
  
  <p>}</p>
  
  <p>The main method is the test program given by the assignment. I realize my code is a little messy - I was scrambling a bit - but I can seem to get most of it working. The only example that doesn't return the right value is number 11. I get false when it should be true. The reason I think this is happening is because since the string y starts with a '<em>', the thing my method does is splits both x and y strings into their last 3 characters, even though that first '</em>' in y is supposed to represent 2 characters. How can I make it so that cases like this return a match?</p>