1. 程式人生 > >【劍指offer】字串的排列與組合

【劍指offer】字串的排列與組合

【1、字串排列】

【題目】

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。 
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
【程式碼】
import org.junit.Test;

public class AllSort {

	public void permutation(char[] buf, int start, int end) {
		if (start == end) {// 當只要求對陣列中一個字母進行全排列時,只要就按該陣列輸出即可
			for (int i = 0; i <= end; i++) {
				System.out.print(buf[i]);
			}
			System.out.println();
		} else {// 多個字母全排列
			for (int i = start; i <= end; i++) {
				char temp = buf[start];// 交換陣列第一個元素與後續的元素
				buf[start] = buf[i];
				buf[i] = temp;

				permutation(buf, start + 1, end);// 後續元素遞迴全排列

				temp = buf[start];// 將交換後的陣列還原
				buf[start] = buf[i];
				buf[i] = temp;
			}
		}
	}

	@Test
	public void testPermutation() throws Exception {
		char[] buf = new char[] { 'a', 'b', 'c' };
		permutation(buf, 0, 2);
	}
}

【2、字串組合】

【分析】

求組合的問題,跟求排列的問題類似,很容易的想到遞迴的實現方式。

在求一個字串中所有字元的組合的時候,針對一個字元,有兩種情況,假設在長度為n的字串中選擇長度為m的組合字串,

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

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

遞迴結束的條件就是,當m為0,即從字串中不再選出字元的時候,這個時候已經找到了m個字元的組合,輸出即可。還有一個條件是,當輸入的字串是串,自然是不能從中選出任何字元的。

package yuesef;

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

public class TT {
	public static void main(String ss[]) {
		perm("123");
		System.out.println();
	}

	// 求字串中所有字元的組合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++) {
			perm(s, i, result);
		}
	}

	// 從字串s中選擇m個字元
	public static void perm(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.println();
			return;
		}

		if (s.length() != 0) {
			// 選擇當前元素
			result.add(s.charAt(0) + "");
			perm(s.substring(1, s.length()), m - 1, result);
			result.remove(result.size() - 1);//注意:遞迴出棧時需要移除List中的字元組合
			// 不選當前元素
			perm(s.substring(1, s.length()), m, result);
		}
	}
}