package main
import "strings"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param str string字符串 
 * @return string字符串一维数组
*/
var res []string
var chars []string
func Permutation( str string ) []string {
    // write code here
    chars = strings.Split(str, "")
	dfs(0)
	return res
}


func dfs(start int) {
	//遍历到结尾
	if start == len(chars)-1 {
		//将切片转为string
		res = append(res, strings.Join(chars, ""))
		return
	}
	existMap := make(map[string]int, 0)
	for i := start; i < len(chars); i++ {
		//同一层递归中,存在相同的字符,跳过
		if _, ok := existMap[chars[i]]; ok {
			continue
		}
		//记录字符
		existMap[chars[i]] = 1
		//交换字符
		swap(i, start)
		//递归
		dfs(start + 1)
		//恢复交换的字符
		swap(start, i)
	}
}

func swap(i, j int) {
	tmp := chars[i]
	chars[i] = chars[j]
	chars[j] = tmp
}