最近用到了字符串的全排算法,全排也是常用的算法,索性就将一些常用的全排算法做了些总结,其中前两个是我常用的算法,其他的属于学习总结内容。内容部分来源于网络,部分是经验总结。
1、拼接法(递归实现)
a、将待全排的字符串作源串,空串作为目标串。
b、每次从源串中取出一个字符放到目标串的后面,然后在把减少后的源串和增加后的目标串作为新的源串和目标串。
c、重复前面的操作b直到源串长度为零即可得到一种全排结果。
d、依次取出不同的字符重复上述操作即可得到全排的全部结果!
import java.util.Scanner;
public class Permutation1 {
static void perm(String s1, String s2) {
if (s1.length() == 0) {
System.out.println(s2);
return;
}
for (int i = 0; i < s1.length(); i++) {
perm(s1.substring(0, i) + s1.substring(i + 1), s2 + s1.charAt(i));
}
}
public static void main(String[] args) {
String s1 = "abcd";
String s2 = "";
perm(s1, s2);
}
}
2、交换法(递归实现)
a、将待全排的字符串作为源串,从源串的第一位开始分别和源串中其他字符经行交换
b、将每次交换后的结果作为新的源串从下一个位置开始和源串的其他字符交换
c、重复上述操作b即可得到全排结果。
public class Permutation2 {
static void swap(char[] arr, int i, int j) {
if (i != j) {
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
static void perm(char[] arr, int n) {
if (n >= arr.length) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "");
}
System.out.println();
return;
}
for (int i = n; i < arr.length; i++) {
swap(arr, i, n);
perm(arr, n + 1);
swap(arr, i, n);
}
}
public static void main(String[] args) {
char[] str = {'a','b','c','d'};
perm(str, 0);
}
}