Permutation of a string eliminating duplicates
Best beginner's code I've seen.  Possibly ever.  Admittedly, I haven't reviewed too many beginner's programmes, but this one was definitely an easy review.
Only style change I'd suggest is to avoid the single-line if (s.charAt(currIndex) == s.charAt(i)) continue;.  It's totally valid, but easy to miss.  At least put the continue on a new line; many people prefer to put it in braces, too.
Since your main() method is obviously a way to test the rest of the code, I'd suggest pulling the loops that are currently in there into a self-documenting method like testPermutation(String arg) and call that from main().
Now that your main method is so simple (it just contains testPermutation("abc"); and testPermutation("aabb");), change it to either

loop over the arguments to main(), so you can call your program like java yourpackage.Permutation abc aabb, or
read strings from stdin until user exits.

To measure time complexity, you can maintain a counter that gets incremented inside swap(), and infer from that result.  I think you'll find that it's much less than n! * n.
Space complexity is the same as time complexity, since you create a new String every time you swap.  Or depending on how you define "space complexity", I suppose it might be n * time complexity, since each time you swap, you create a String of length n.