public List<List<String>> partition2(String s) {
      List<List<String>> rst = new ArrayList<List<String>>();
      if(s == null || s.isEmpty()) {
	      List<String> tmp = new ArrayList<String>();
	      rst.add(tmp);
          return rst;
      }
      
      for(int i = 0; i < s.length(); i++) {
          String curt = s.substring(0, i + 1);
          if(isPalindrome(curt)) {
              List<List<String>> tmp = partition2(s.substring(i + 1));
              for(List<String> list : tmp) {
                  list.add(0, curt);
              }
              rst.addAll(tmp);
          }
      }
      
      return rst;
  }