38、字符串的排列

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

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

2、思路:解决这道题首先就要自己手写一遍所有可能性,并总结出规定的步骤才能解题,这道题分为两步,

输入:abc

第一步:列出字符串的第一个位置所有可能出现的字符,主要的方式就是将第一个字符与后边所有的字符进行交换。

abc

bac

cba

第二步:固定第一个字符求后边所有字符的排列。对于后边部分的字符仍然采用将后边的字符分成两部分的方式,第一个字符和后边的字符依次交换顺序。

abc

acb

bac

bca

cba

cab

使用set进行去重

abc, bac , cba , acb , bca , cab

 

3、代码:

import java.util.*;
public class Solution {
    public static ArrayList Permutation(String str) {
        if (str == null || str.length() == 0) {
            return new ArrayList<>();
        }
     //set用于结果去重 Set
set = new TreeSet<>(); helper(str.toCharArray(), 0, set); return new ArrayList<>(set); }

  //这一步代码没理解
public static void helper(char[] s, int i, Set set) { if (i == s.length) { set.add(String.valueOf(s)); } for (int j = i; j < s.length; j++) { swap(s, i, j); helper(s, i + 1, set); swap(s, i, j); } } public static void swap(char[] s, int i, int j) { if (i == j) return; char temp = s[j]; s[j] = s[i]; s[i] = temp; } }

注意:使用java和c++的思想一样,但实现方式不一样,不能完全照搬。

你可能感兴趣的:(38、字符串的排列)