欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

字符串排列

程序员文章站 2022-07-12 09:19:42
...

【原题】
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
【思路】
我们首先把一个字符串看成两个步骤:
1. 确定当前的字符
2. 当前字符确定,确定剩下的字符

用题中的例子来说:
abc
假设当前的位置为第一个位置,则该例子中所有可能的情况为:
abc(交换a,a)
bac(交换a,b)
cba (交换a,c)
第一个字符确定了之后,对于上面的所有情况按照同样的方法把要确定的字符和后面的字符依次交换。很显然这是一个递归的过程。
直到最后一个位置确定。

import java.util.ArrayList;

import java.util.TreeSet;
public class Solution {
//交换数组两个字符的位置
  public void swap(char[] array,int x,int y){
        char tmp=array[x];
        array[x]=array[y];
        array[y]=tmp;
    }
    public void PermutationCore(char[] chArray,TreeSet<String> list,int start){
    //
        if(start==chArray.length) //已经生成一个排列
            list.add(String.valueOf(chArray));
        for(int i=start;i<chArray.length;i++){//依次交换当前以及后面的字符,从当前位置开始
            swap(chArray,start,i);//
            PermutationCore(chArray,list,start+1);//当前字符已经确定,递归处理余下的字符
            swap(chArray,i,start);//因为当前和一个位置交换以后,还要和其它位置交换,所以要交换回来
        }
    }
     public ArrayList<String> Permutation(String str) {
         ArrayList<String> list=new ArrayList<String>();
         TreeSet<String> set=new TreeSet<>();//使用排序的set,确保有序以及唯一
         char[] chArray=str.toCharArray();
         if(str.length()==0) return list;
         PermutationCore(chArray,set,0);
         list.addAll(set);
         return list;
        }
}