在做编程题时经常遇到字符串的排列与组合问题,特此总结一下
1.字符的全排列(无重复字符)
/**
* 字符串的全排列,无重复字符
* @param list 字符数组
* @param n 当前交换的位置(初始为0)
*/
public static void permute(char[] list,int n){
if(n==list.length){
for(int i=0;i<list.length;i++)
System.out.print(list[i]);
System.out.println();
return ;
}
for(int i=n;i<list.length;i++){
swap(list, i, n);
permute(list, n+1);
swap(list, i, n);
}
}
public static void swap(char[] list,int a,int b){
char c = list[a];
list[a] = list[b];
list[b] = c;
}
2.字符的全排列(含重复字符)
/**
* 字符串的全排列(含重复字符)
* @param list 字符数组
* @param n 当前交换的位置(初始为0)
*/
public static void permute(char[] list,int n){
if(n==list.length){
for(int i=0;i<list.length;i++)
System.out.print(list[i]);
System.out.println();
return ;
}
for(int i=n;i<list.length;i++){
//如果是重复字符,则不进行交换
if(list[i]==list[n]&&i!=n)
continue;
swap(list, i, n);
permute(list, n+1);
swap(list, i, n);
}
}
public static void swap(char[] list,int a,int b){
char c = list[a];
list[a] = list[b];
list[b] = c;
}
3.字符的组合(无重复字符)
public class Test {
//存储字符
static ArrayList<Character> stack = new ArrayList<>();
public static void main(String[] args) {
String str = "1234";
for(int i=0;i<str.length();i++){
combine(str.toCharArray(), 0,str.length(), i);
}
}
/**
* 字符的组合(无重复字符)
* @param list 字符数组
* @param start 起始的下标(初始为0)
* @param m 数组长度
* @param n 当前组合的字符数 (从1到m)
*/
public static void combine(char[] list,int start,int m,int n){
if(start>=m||n<0)
return;
//添加第一个字符
stack.add(list[start]);
if(n==0)
System.out.println(stack);
combine(list, start+1, m, n-1);
//没有添加第一个字符
stack.remove(stack.size()-1);
combine(list, start+1, m, n);
}
}
4.字符组合(含重复字符)
public class Test {
static StringBuilder sb = new StringBuilder();
static ArrayList<String> ans = new ArrayList<>();
public static void main(String[] args) {
String str = "1223";
for(int i=0;i<str.length();i++){
combine(str.toCharArray(), 0,str.length(), i);
}
System.out.println(ans);
}
/**
* 字符的组合(无重复字符)
* @param list 字符数组
* @param start 起始的下标(初始为0)
* @param m 数组长度
* @param n 当前组合的字符数 (从1到m)
*/
public static void combine(char[] list,int start,int m,int n){
if(start>=m||n<0)
return;
//添加第一个字符
sb.append(list[start]);
if(n==0){
String str = sb.toString();
if(!ans.contains(str))
ans.add(str);
}
combine(list, start+1, m, n-1);
//没有添加第一个字符
sb.deleteCharAt(sb.length()-1);
combine(list, start+1, m, n);
}
}