【劍指offer】字串的排列與組合
阿新 • • 發佈:2019-02-10
【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); } } }