输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
package main import ( "fmt" "sort" ) func main() { var s string fmt.Scan(&s) res := []string{} n := len(s) st := make([]bool,n) visited := make(map[string]bool) dfs(s,"",&st,&res,&visited) sort.Strings(res) for i:=0;i<len(res)-1;i++{ res[i] = res[i]+"," } fmt.Println(res) } func dfs(s string,tmp string,st *[]bool,res *[]string,visited *map[string]bool){ if (*visited)[tmp]{ return }else{ (*visited)[tmp] = true } if len(tmp) == len(s){ (*res) = append((*res), tmp) return } for i:=0 ; i < len(s);i++{ if !(*st)[i]{ (*st)[i] = true dfs(s,tmp + string(s[i]),st,res,visited) (*st)[i] = false } } }
package main import ( "fmt" "sort" ) func main() { var s string fmt.Scan(&s) res := calStr(s) sort.Slice(res, func(i, j int) bool { return res[i]+res[j] < res[j]+res[i] }) for i := 0; i < len(res)-1; i++ { res[i] += "," } fmt.Println(res) } func calStr(s string) []string { res := make([]string, 0) m := make(map[string]bool) r := []rune(s) length := len(r) for i := 0; i < length; i++ { if length == 2 { res = append(res, s) r[0], r[1] = r[1], r[0] if !m[string(r)] { res = append(res, string(r)) m[string(r)] = true } break } else { t := string(r[1:length]) tmp := calStr(t) for _, v := range tmp { if !m[string(r[0])+v] { res = append(res, string(r[0])+v) m[string(r[0])+v] = true } } if i < length-1 { r[0], r[i+1] = r[i+1], r[0] } } } return res }