1. 程式人生 > >java實現字串排列組合問題

java實現字串排列組合問題

import java.util.ArrayList;
import java.util.Collections;

/**
 * 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,
 * bca,cab和cba。
 * 
 * @author pomay
 *
 */
public class Solution_stringarrange
{
	public ArrayList<String> Permutation(String str)
	{
		if (str == null)
			return null;
		ArrayList<String> list = new ArrayList<String>();
		char[] pStr = str.toCharArray();

		Permutation(pStr, 0, list);
		Collections.sort(list);
		return list;
	}

	static void Permutation(char[] str, int i, ArrayList<String> list)
	{
		// 如果為空
		if (str == null)
			return;
		// 如果i指向了最後一個字元
		if (i == str.length - 1)
		{
			if (list.contains(String.valueOf(str)))
				return;
			list.add(String.valueOf(str));
		} else
		{
			// i指向當前我們做排列操作的字串的第一個字元
			for (int j = i; j < str.length; j++)
			{
				// 把做排列操作的字串的第一個字元和後面的所有字元交換
				char temp = str[j];
				str[j] = str[i];
				str[i] = temp;
				// 交換後對i後面的字串遞迴做排列操作
				Permutation(str, i + 1, list);
				// 每一輪結束後換回來進行下一輪排列操作
				temp = str[j];
				str[j] = str[i];
				str[i] = temp;
			}
		}

	}

	public static void main(String[] args)
	{
		String str = "aab";
		Solution_stringarrange changestring = new Solution_stringarrange();
		ArrayList<String> list = changestring.Permutation(str);
		for (int i = 0; i < list.size(); i++)
		{
			System.out.print(list.get(i) + " ");
		}
	}
}
組合:

要麼選擇長度為n的字串中的第一個字元,那麼要在其餘的長度n-1的字串中選擇m-1個字元

要麼不選擇長度為n的字串中的第一個字元,那麼要在其餘的長度n-1的字串中選擇m個字元

import java.util.ArrayList;
import java.util.List;

/**
 * 輸入一個字串,按字典序打印出該字串中字元的所有組合。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串a,b,c,ab,ac,bc
 * ,abc 。 求n個字元組成長度為m的組合問題
 * 
 * @author pomay
 *
 */
public class Solution_stringcombination
{
	// 求字串中所有字元的組合abc>a,b,c,ab,ac,bc,abc
	public static void perm(String s)
	{
		List<String> result = new ArrayList<String>();
		// 從一個開始
		for (int i = 1; i <= s.length(); i++)
		{
			combination(s, i, result);
		}
	}

	// 從字串s中選擇m個字元
	public static void combination(String s, int m, List<String> result)
	{
		// 如果m==0,則遞迴結束。輸出當前結果
		if (m == 0)
		{
			for (int i = 0; i < result.size(); i++)
			{
				System.out.print(result.get(i));
			}
			System.out.print("、");
			return;
		}

		if (s.length() != 0)
		{
			// 選擇當前元素
			result.add(s.charAt(0) + "");
			// substring用法,截取出從1開始到n結束的字串
			combination(s.substring(1, s.length()), m - 1, result);
			result.remove(result.size() - 1);
			// 不選當前元素
			combination(s.substring(1, s.length()), m, result);
		}
	}

	public static void main(String[] args)
	{
		String str = "abc";
		perm(str);
	}
}