package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param str string字符串 
 * @return string字符串一维数组
*/
func Permutation( str string ) []string {
  	// 思路和有重复数字数组的排列组合一个思路
    if len(str)<2 {return []string{str}}
    bytes:=[]byte(str)
    return bt(bytes,0)
}

func bt(bytes []byte,level int)[]string{
    if len(bytes)==level{return []string{string(bytes)}}
    visit:=map[byte]bool{}
    result:=[]string{}
    for i:=level;i<len(bytes);i++{
        if !visit[bytes[i]]{
            visit[bytes[i]]=true
            bytes[i],bytes[level]=bytes[level],bytes[i]
            result=append(result, bt(bytes,level+1)...)
            bytes[i],bytes[level]=bytes[level],bytes[i]
        }
    }
    return result
}