前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[每日一题]全排列问题的java实现

[每日一题]全排列问题的java实现

作者头像
呼延十
发布2019-07-01 16:43:06
1.5K0
发布2019-07-01 16:43:06
举报
文章被收录于专栏:呼延呼延

来源:

经典的全排列问题

描述

给定一个字符串,输出他的全排列。

样例

代码语言:javascript
复制
给定"ABC"

输出:
ABC
ACB
BCA
BAC
CAB
CBA

解题思路:

这道题是数学中的全排列问题,输出结果的个数为n!.

那么怎么获得具体的所有排列呢?

对于ABC来说,

排列的第一位有三种可能:ABC,当第一位确定之后,第二位有两种可能,第三位只有一种可能.

首先确定第一位,可能是3种,分别计算.

代码语言:javascript
复制
A---的第二位可能是B,C,全排列分别为:
  ABC
  ACB
B---的第二位可能是AC,全排列分别为:
  BAC
  BCA
C---的第二位可能是AB,全排列分别为:
  CBA
  CAB

可以看出,ABC的全排列为:

(A+(BC的全排列)) + (B+(AC的全排列)) + (C + (AB的全排列)).

可以使用递归来实现.

实现代码

代码语言:javascript
复制
  /**
   * 全排列递归实现
   */
  private List<String> quanpailie(char[] cs, int current) {
    //结果
    List<String> result = new LinkedList<>();
    //当前指向数组最后一位时,将数组(全排列的一种)输出到结果集里
    if (current == cs.length - 1) {
      result.add(Arrays.toString(cs));
    } else {
      //循环改变数组的第一个位置的值,并求剩下的其他字符的全排列,并装入结果集.
      for (int i = current; i < cs.length; i++) {
        //交换当前字符与下一字符
        swap(cs, current, i);
        //这一块难理解,相当于,在A确定放在第一位的时候,求BC的全排列,并且加上A,形成ABC,ACB放入结果集.
        result.addAll(quanpailie(cs, current + 1));
        //交换回来,方便下一次交换.
        swap(cs, current, i);
      }
    }
    return result;
  }

  /**
   * 交换数组第b,e位置上的值
   */
  private void swap(char[] cs, int b, int e) {
    char tmp = cs[b];
    cs[b] = cs[e];
    cs[e] = tmp;
  }

完。

ChangeLog

2018-12-11 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 来源:
  • 描述
  • 样例
  • 解题思路:
  • 实现代码
    • ChangeLog
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档