import java.util.*;
public class Solution {
    //交换法
    public ArrayList<String> Permutation(String str) {
       HashSet<String> set = new HashSet<>() ;
       helper(str.toCharArray() , 0 , set) ;
       ArrayList<String> res = new ArrayList<>(set) ;
        return res ;
    }
    
    //求arr[loc,,,,]的全排列
    public void helper(char[] arr , int loc , HashSet<String> res) {
        if(loc == arr.length-1) {//若loc是最后一个位置,则不用交换,证明一次排列已经完成
            res.add(new String(arr)) ;    
        }
        for(int i = loc ; i < arr.length ; i ++) {
            swap(arr,i,loc) ;//让loc之后的每一个位置与loc交换
            helper(arr,loc+1,res) ;//交换之后求loc+1之后的全排列
            swap(arr,i,loc) ;//还原,准备下一次交换
        }
    }
    public void swap(char[] arr , int index1 , int index2) {
        char t = arr[index1] ;
        arr[index1] = arr[index2] ;
        arr[index2] = t ;
    }
}