利用遞迴解決全排列問題
阿新 • • 發佈:2019-02-17
什麼是排列?一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列。特別地,當m=n時,這個排列被稱作全排列。
拿字串舉例,就是找出這個字串的所有元素組成的所有不同的序列,注意,這些序列具有唯一性,所以就要仔細考慮字串存在相同元素的情況。
abc這樣的一個字串,它的全排列就有:abc、acb、bac、bca、cba、cab
不妨把abc分成兩部分——字首+子字串,可以得到整個字串的全排列=字首+子字串的全排列,首先將所有元素依次放到第一個元素,將其作為字首,如axx,bxx,cxx,然後再來找剩下字串的全排列,這時我們又可以把剩下的字串分為字首+字串的形式,依次類推,直到子字串只有一個元素,那麼這個字首加上這個子字串就是原字串的其中一個全排列。程式碼如下:
import java.util.ArrayList; import java.util.TreeSet; public class Solution { public ArrayList<String> Permutation(String str) { if(str.length()==0){ return new ArrayList<String>(); } ArrayList<String> list = new ArrayList<String>(); TreeSet<String> set = new TreeSet<String>(); char[] charArray = str.toCharArray(); Array(set, charArray, 0, charArray.length-1); for(String string:set){ list.add(string); } return list; } public void Array(TreeSet<String> set, char[] charArray, int beginIndex, int endIndex){ if(beginIndex==endIndex){ String result = new String(charArray); set.add(result); return; }else{ for(int i=beginIndex;i<=endIndex;i++){ swap(charArray, beginIndex, i); Array(set, charArray, beginIndex+1, endIndex); swap(charArray, beginIndex, i); } } } public void swap(char[] charArray, int first, int second){ char temp = charArray[first]; charArray[first] = charArray[second]; charArray[second] = temp; } }