【剑指offer】-字符串的排列-26/67

简介: 【剑指offer】-字符串的排列-26/67

1. 题目描述

输入一个字符串,按字典序打印出该字符 串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

2. 输入描述

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

3. 题目分析

  1. 经典的一道全排列算法的题目
  2. 全排列算法
  3. 这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3个元素,所有的排列情况有3!=6种,对于每一种排列,其第一个元素有3种选择a,b,c,对于第一个元素为a的排列,其第二个元素有2种选择b,c;第一个元素为b的排列,第二个元素也有2种选择a,c,……,依次类推,我们可以将集合的全排列与一棵多叉树对应。如下图所示

4. 题目代码

public ArrayList<String> Permutation(String str) {
    ArrayList<String> strings = new ArrayList<String>();
    if (str == null || str.length() == 0) {
      return strings;
    }
    char[] string = str.toCharArray();
    perm(strings, string, 0, string.length - 1);
    Collections.sort(strings);
    return strings;
  }
  public static void perm(ArrayList<String> strings, char[] a, int k, int m ) {
    if (k == m) {
      String str = String.valueOf(a);
      if (strings.contains(str) == false) {
        strings.add(str);
      }
    } else {
      /*
       * 进入时 
       */
      for (int i = k; i <= m; i++) {
        swap(a, i, k);
        perm(strings, a, k + 1, m);
        // 回溯
        swap(a, i, k);
      }
    }
  }
  public static void swap(char[] a, int x1, int x2) {
    char temp;
    temp = a[x1];
    a[x1] = a[x2];
    a[x2] = temp;
  }


相关文章
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
61 0
|
6月前
|
Python C++ Java
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
57 0
C/C++每日一练(20230407) 选择排序法、多数元素、字母异位词分组
|
6月前
|
Java
每日一题《剑指offer》字符串篇之字符串的排列
每日一题《剑指offer》字符串篇之字符串的排列
77 0
每日一题《剑指offer》字符串篇之字符串的排列
|
6月前
面试题 01.04:回文排列
面试题 01.04:回文排列
35 0
|
6月前
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
32 0
每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题
每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题
剑指offer 39. 数字排列
剑指offer 39. 数字排列
74 0
剑指offer_字符串---字符串的排列
剑指offer_字符串---字符串的排列
50 0
LeetCode 567. 字符串的排列
LeetCode 567. 字符串的排列
90 0
LeetCode 567. 字符串的排列
|
测试技术
每日一题——倒置字符串
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
108 0