最强解析面试题:字符串全排列「建议收藏!」

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最强解析面试题:字符串全排列「建议收藏!」相关的知识,希望对你有一定的参考价值。


最强解析面试题:字符串全排列「建议收藏!」

文章讲解 “ 字符串全排列 ” 经典面试题,包含思路及源码,及解惑!

题目

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

示例1

输入:
“ab”
返回值:
[“ab”,“ba”]
说明:
返回[“ba”,“ab”]也是正确的

思路

1、通过递归处理,从首字母开始依次替换后续字母的位置,可得到全部字符排列
2、存在重复字母时,排列中会存在重复,故去重

代码

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param str string字符串
 * @return string字符串一维数组
 */
func Permutation(str string) []string {
   // write code here
   var res []string
   strArr := []byte(str)
   m := make(map[string]struct{})
   if len(strArr) <= 0 {
      return res
   }
   resTmp := Res(strArr, 0)
   for i, _ := range resTmp {
      if _, ok := m[resTmp[i]]; !ok {
         m[resTmp[i]] = struct{}{}
         res = append(res, resTmp[i])
      }
   }
   return res
}
func Res(str []byte, index int) []string {
   var res []string
   if index == len(str)-1 {
      res = append(res, string(str))
      return res
   }
   for i := index; i <= len(str)-1; i++ {
      str[i], str[index] = str[index], str[i]
      //res = append(res,string(str))
      res = append(res, Res(str, index+1)...)
      str[i], str[index] = str[index], str[i]
   }
   return res
}

附录

忙碌和早起

以上是关于最强解析面试题:字符串全排列「建议收藏!」的主要内容,如果未能解决你的问题,请参考以下文章

最强解析面试题:替换空格「建议收藏!」

最强解析面试题:替换空格「建议收藏!」

最强解析面试题:从尾到头打印链表「建议收藏!」

最强解析面试题:从尾到头打印链表「建议收藏!」

最强解析面试题:矩形覆盖「建议收藏!」

最强解析面试题:矩形覆盖「建议收藏!」