Java实现abc字符串排列组合
1.可重复排列:abc三个字符组成的所有长度为3的字符串,aaa,cc ⼀共27种
字符串常量池在堆中吗利⽤递归的思想,第⼀个字符可以从abc中选择⼀个,三种选择,之后问题转化为abc组成长度为2的字符的情况,循环递归后可以求出所有的可能。控制好循环退出条件即可。
利⽤递归可以处理,不知道字符长度的情况下,即通⽤处理。如果知道长度,只需要利⽤多层循环,也可以得出结论。
public class Permutation {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
per(new char[3], chs, 3-1);
}
public static void per(char[] buf, char[] chs, int len){
if(len == -1){
for(int i=buf.length-1; i>=0; --i)
System.out.print(buf[i]);
System.out.println();
return;
}
for(int i=0; i<chs.length; i++){
buf[len] = chs[i];
per(buf, chs, len-1);
}
}
}
可重复选择,⼀共27种情况,结果如下图所⽰
2.全排列:还是abc三个字符,全排列即字符不能重复。最后 3*2 =6种结果
可以利⽤1中的⽅法,只要判断3个字符是否相等,都不相等的才是需要的全排列⾥的⼀个。这样的时间复杂度为n^n,⽽全排列的种类为n!所以需要设计⼀种n!的算法。
也可以利⽤递归,第⼀个字符串⼀共有n种选择,剩下的变成⼀个n-1规模的递归问题。⽽第⼀个字符的n种选择,都是字符串⾥⾯的。因此可以使⽤第⼀个字符与1-n的位置上进⾏交换,得到n中情况,然后递归处理n-1的规模,只是处理完之后需要在换回来,变成原来字符的样⼦。
public class Arrange {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
arrange(chs, 0, chs.length);
}
public static void arrange(char[] chs, int start, int len){
if(start == len-1){
for(int i=0; i<chs.length; ++i)
System.out.print(chs[i]);
System.out.println();
return;
}
for(int i=start; i<len; i++){
char temp = chs[start];
chs[start] = chs[i];
chs[i] = temp;
arrange(chs, start+1, len);
temp = chs[start];
chs[start] = chs[i];
chs[i] = temp;
}
}
}
运⾏结果如下图所⽰,⼀共6种组合
3.组合:abc三个字符的所有组合
求所有组合也就是abc各个位是否选取的问题,第⼀位2中可能,第⼆位2种。。。所以⼀共有2^n种。⽤
0表⽰不取,1表⽰选取,这样可以⽤110这样的形式表⽰ab。abc⼀共的表⽰形式从0到2^3-1。然后按位与运算,如果结果为1就输出当前位,结
果0不输出。
public class Comb {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
comb(chs);
}
public static void comb(char[] chs) {
int len = chs.length;
int nbits = 1 << len;
for (int i = 0; i < nbits; ++i) {
int t;
for (int j = 0; j < len; j++) {
t = 1 << j;
if ((t & i) != 0) { // 与运算,同为1时才会是1
System.out.print(chs[j]);
}
}
System.out.println();
}
}
}
输出结果如下,第⼀⾏为空,表⽰⼀个都不取
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论