import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
       ArrayList<String> ret = new ArrayList<>() ;
        if(str == null) {
            return ret ;
        }
        HashSet<String> set = new HashSet<>() ;
        recursion(str.toCharArray() , 0 , set , new StringBuilder()) ;
        for(String s : set) {
            ret.add(s) ;
        }
        return ret ;
    }
    public void recursion(char[] arr , int now ,HashSet<String> ret , StringBuilder path) {
        if(now == arr.length) {
            ret.add(new String(path)) ;
            return ;
        }
        for(int i = now ; i < arr.length ; i ++) {
            path.append(arr[i]) ; 
            swap(arr,now , i) ;
            recursion(arr,now+1,ret,path) ;
            swap(arr,now , i) ;
            path.deleteCharAt(path.length()-1) ;
        }
    } 
    public void swap(char[] arr , int i , int j) {
        char temp = arr[i] ;
        arr[i] = arr[j] ;
        arr[j] = temp ;
    }
}