字符串的排列

Posted 氵冫丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串的排列相关的知识,希望对你有一定的参考价值。

题目

输入一个字符串,按字典序打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题

把一个字符串看成两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。求整个字符串的排列,分为两步:
第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换
第二步:固定第一个字符,求后面所有字符的排列,这个时候扔把后面的所有字符看成两个部分:后面字符的第一个字符,以及这个字符之后的所有字符,这是一个递归的过程。

核心程序

for(int i = start;i<chars.length;i++){
            // 交换
            swap(chars,start,i);
            // 递归
            Permutation(chars,start+1,set);
            // 换回去
            swap(chars,start,i);
        }

从start位置开始与后面(包括start)的所有位置互换
互换后进行递归,注意递归的起始位置是start+1,而不是i+1,下次递归是下一个位置和后面的所有位置进行互换。
最后要回溯,换回去

import java.util.ArrayList;
import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
       ArrayList<String> result = new ArrayList<String>();

       if(str == null || str.length()==0){
           return result;
       }
        Set<String> set = new TreeSet<String>();
        char array[] = str.toCharArray();

        Permutation(array,0,set);

        result.addAll(set);
        return result;
    }

      public void Permutation(char[] chars,int start,Set<String> set){

        if(start == chars.length -1 ){
            String p = String.valueOf(chars);
            set.add(p);
            return;
        }
        for(int i = start;i<chars.length;i++){
            // 交换
            swap(chars,start,i);
            // 递归
            Permutation(chars,start+1,set);
            // 换回去
            swap(chars,start,i);
        }

    }

    public void swap(char[] array,int i,int j){
        char tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}

以上是关于字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章

itertools 排列组合

20160213.CCPP体系详解(0023天)

21个常用代码片段

片段(Java) | 机试题+算法思路+考点+代码解析 2023

PHP 代码片段

为啥这个字符串排列代码超过了递归限制?