小程式:遞迴實現所有變位詞的排列組合
阿新 • • 發佈:2019-01-29
找出一個單詞的所有變位詞,例如給到單詞“stop”,找到對應的變位詞“pots”和“tops”。
採用暴力解法的話,把所有的可能性都排列組合一遍,一個一個判斷;在排列組合這步很適合用遞迴來實現,寫了個小程式測試了下。
輸入樣例:abcd
輸出樣例:abcd,abdc,acbd,acdb,adbc,adcb,bacd,badc,bcad,bcda,bdac,bdca,cabd,cadb,cbad,cbda,cdab,cdba,dabc,dacb,dbac,dbca,dcab,dcba
遞迴部分的實現:
/** * 遞迴的核心部分,將結果儲存到anagrams_arr中 * @param prefix 變位詞中的前半部分,保持不變 * @param ana 需要遞迴遍歷的內容 */ private void anagrams(String prefix,String ana) { if(ana.length() == 1) anagrams_arr.add(prefix + ana); for(int i = 0; i<ana.length();i++) { //新的字首是:原有字首+此次選定的字母;遞迴的內容減去此次選定的字母 anagrams(prefix + ana.charAt(i),ana.substring(0,i) + ana.substring(i+1)); } }
e.g. 傳入的資料是“123”
第一層anagrams引數(“”,“123”);
由於輸出的引數長度不是1,利用迴圈重新呼叫遞迴程式碼;
第二層anagrams引數round1(“1”,“23”)
輸入的引數長度仍然不為1,利用迴圈重新調anagrams;
第三層anagrams引數round1(“12”,“3”)
輸入引數長度是1,將“123”儲存,退出第三層迴圈round1回到第二層anagrams,利用迴圈調第三層anagrams;
第三層anagrams引數round2(“13”,“2”)
……
完整程式碼如下所示,供參考:
public class Anagram { private String word; private ArrayList<String> anagrams_arr = new ArrayList<String>(); private String[] anagrams; public static void main(String args[]) { Anagram test = new Anagram(); String abc = "abcd"; String[] result = test.getAnagrams(abc); for(int i = 0; i<result.length; i++) System.out.print(result[i] + ","); } public String[] getAnagrams(String word) { anagrams_arr.clear(); anagrams("",word); anagrams = new String[anagrams_arr.size()]; anagrams_arr.toArray(anagrams); return anagrams; } /** * 遞迴的核心部分,將結果儲存到anagrams_arr中 * @param prefix 變位詞中的前半部分,保持不變 * @param ana 需要遞迴遍歷的內容 */ private void anagrams(String prefix,String ana) { if(ana.length() == 1) anagrams_arr.add(prefix + ana); for(int i = 0; i<ana.length();i++) { //新的字首是:原有字首+此次選定的字母;遞迴的內容減去此次選定的字母 anagrams(prefix + ana.charAt(i),ana.substring(0,i) + ana.substring(i+1)); } } }