您的位置:首页 > 编程语言 > Java开发

字符串的排列

2017-07-01 15:30 267 查看
1.题目描述:输入一个字符串,按字典序打印出该字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

2.思路分析

本题考察两个点

1)全排列问题,就是将每一位固定,后面的字符全排列,即可得到。如123–》第一位固定其他的每一位交换得到123、132–》第二位固定其他的交换得到213、231–》第三位固定312、321。最终得到{123,132,213,231,312,321}

2)进行字典排序,所谓字典排序就和查字典一样,先查询到值较小开头的字符串123、132.然后查询到213、231以此类推。

3.代码如下:

package stringOrder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
public class Solution {
/***先进行全排列全排列就是从第一位开始,首先固定一位其余各位进行全排列,
*之后利用Collection.sort()进行字典排序
* @param str
* @return
*/
public static ArrayList<String> Permutation(String str){
ArrayList<String> res = new ArrayList<String>();
if(str==null||str.length()==0)
return res;
HashSet<String> set = new HashSet<String>();
permutation(set,str.toCharArray(),0);
res.addAll(set);
Collections.sort(res);
return res;
}

static void permutation(HashSet<String> set,char[] ch,int k){
if(k==ch.length){
set.add(new String(ch));
return;
}
for(int i=k;i<ch.length;i++){
swap(ch,k,i);
permutation(set,ch,k+1);
swap(ch,k,i);
}
}

static void swap(char[] c,int i,int j){
char m;
m= c[i];
c[i]=c[j];
c[j]=m;
}

public static void main(String[] args){
String str = "123";
System.out.println(Permutation(str));
}
}


4.结果



注:本题来自剑指offer,而且为很多公司面试的常考题型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java