1. 程式人生 > >小程式:遞迴實現所有變位詞的排列組合

小程式:遞迴實現所有變位詞的排列組合

找出一個單詞的所有變位詞,例如給到單詞“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));
        }
    }
}