Java实现字符串的全排列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java实现字符串的全排列
1 问题描述
输⼊⼀个字符串,打印出该字符串的所有排列。
例如,输⼊字符串”abc”,则输出有字符’a’,’b’,’c’所能排列出来的所有字符串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。
2 解决⽅案
2.1 递归实现
从字符串中选出⼀个字符作为排列的第⼀个字符,然后对剩余的字符进⾏全排列。
如此递归处理,从⽽得到所有字符的全排列。
package com.liuzhen.string_1;
public class StringArrange {//⽅法1:递归实现
/*
* 参数arrayA:给定字符串的字符数组
* 参数start:开始遍历字符与其后⾯各个字符将要进⾏交换的位置
* 参数end:字符串数组的最后⼀位
* 函数功能:输出字符串数字的各个字符全排列
*/
public void recursionArrange(char[] arrayA,int start,int end){
if(end <= 1)
return;
if(start == end){
for(int i = 0;i < arrayA.length;i++)
System.out.print(arrayA[i]);
System.out.println();
}
else{
for(int i = start;i <= end;i++){
swap(arrayA,i,start);
recursionArrange(arrayA,start+1,end);
swap(arrayA,i,start);
}
}
}
//交换数组m位置和n位置上的值
public void swap(char[] arrayA,int m,int n){
char temp = arrayA[m];
arrayA[m] = arrayA[n];
arrayA[n] = temp;
}
public static void main(String[] args){
StringArrange test = new StringArrange();
String A = "abc";
char[] arrayA = A.toCharArray();
test.recursionArrange(arrayA,0,arrayA.length-1);
}
}
运⾏结果:
abc
acb
bac
bca
cba
cab
2.2 字典序排列实现
思想如下:
(1)找到排列中最后(最右)⼀个升序的⾸位位置i。
(2)找到排列中第i位右边最后⼀个⽐ai⼤的位置j。
(3)交换ai和aj的值。
(4)把第i+1位到最后⼀位的部分进⾏逆序反转。
package com.liuzhen.string_1;
public class StringArrange {
//⽅法2:字典序排列
/*
* 参数arrayA:给定字符串的字符数组
* 函数功能:输出字符串数组的所有字符的字典序全排列
*/
public void dictionaryArrange(char[] arrayA){
System.out.println(String.valueOf(arrayA));
while(allArrange(arrayA))
System.out.println(String.valueOf(arrayA));
}
//判断当前数组arrayA序列是否可以进⾏字典序排列,如可以则进⾏排列并返回true,否则返回false public boolean allArrange(char[] arrayA){
int i;
for(i = arrayA.length-2;(i >= 0) && arrayA[i] > arrayA[i+1];--i);
if(i < 0)
return false;
int k;
for(k = arrayA.length-1;(k > i) && arrayA[i] >= arrayA[k];--k);
swap(arrayA,i,k);
reverseArray(arrayA,i+1,arrayA.length-1);
return true;
}
//将数组中a[m]到a[n]⼀段元素反序排列
public void reverseArray(char[] arrayN,int m,int n){
while(m < n){
char temp = arrayN[m];
arrayN[m++] = arrayN[n];
arrayN[n--] = temp;
}
}
//交换数组m位置和n位置上的值
public void swap(char[] arrayA,int m,int n){
char temp = arrayA[m];
arrayA[m] = arrayA[n];
arrayA[n] = temp;
}
public static void main(String[] args){
StringArrange test = new StringArrange();
String A = "abc";
char[] arrayA = A.toCharArray();
test.dictionaryArrange(arrayA);
}
}
运⾏结果:
abc
acb
bac
bca
cab
cba。