首页 > 代码库 > 给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合 print-all-combinations-of-given-length

给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合 print-all-combinations-of-given-length

// 给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合

/*

Input: 

set[] = {‘a‘, ‘b‘}, k = 3

Output:

aaa

aab

aba

abb

baa

bab

bba

bbb

Input: 

set[] = {‘a‘, ‘b‘, ‘c‘, ‘d‘}, k = 1

Output:

a

b

c

d



package recursion;

import java.util.ArrayList;

public class N_sets_form_length_k_string {

	// 给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合
	/*
	 Input: 
	set[] = {‘a‘, ‘b‘}, k = 3
	
	Output:
	aaa
	aab
	aba
	abb
	baa
	bab
	bba
	bbb
	
	
	Input: 
	set[] = {‘a‘, ‘b‘, ‘c‘, ‘d‘}, k = 1
	Output:
	a
	b
	c
	d
	 
	 */
	public static void main(String[] args) {
		ArrayList<Character> set = new ArrayList<Character>();
		set.add(‘a‘);
		set.add(‘b‘);
		
		int k = 3;
		ArrayList<String> al = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		rec(set, k, al, sb);
		
		System.out.println(al);
	}
	
	// 观察到选定第一个字符后,问题就转化为k-1的递归问题,而set中的每一个元素都能充当第一个字符。
	// 结束条件就是k为0时。
	public static void rec(ArrayList<Character> set, int k, ArrayList<String> al, StringBuilder sb){
		if(k == 0) {
			al.add(new String(sb));
			return;
		}
		
		for(int i=0; i<set.size(); i++) {
			sb.append(set.get(i));
			rec(set, k-1, al, sb);
			sb.deleteCharAt(sb.length()-1);		// 善用StringBuilder来删除最后一个字符
		}
	}

}

http://www.geeksforgeeks.org/print-all-combinations-of-given-length/