問題描述:假設字串中的所有字元不重複,如何輸出字串的所有組合,例如,輸入字串為「abc」,則輸出a、b、c、ab、ac、bc、abc,共7種組合。
根據題意,如果字串中有n個字元,根據排列組合的性質,此時一共需要輸出2^n-1種組合。
最容易想到的方式是遞迴,遍歷字串,每個字串只能取或不取。若取該字元,就把它放到結果字串中,遍歷完畢後,輸出結果字串。程式**為:
執行結果為:public class combinerecursiveimpl
}}class solution3
if(begin==c.length)
system.out.print(sb+",");
combinerecursive(c, begin+1, len-1, sb);
sb.deletecharat(sb.length()-1);
system.out.print(sb+",");
combinerecursive(c, begin+1, len, sb);
}}
a b c ab ac bc abc
採用遞迴法求解,當n的值不是很大時,不存在效率低下的問題,但當n比較大時,效率會變得很差,因為棧呼叫次數約為2^n,為了提高效率,考慮本題的特性,可以構造乙個長度為n的01字串(或二進位制數)表示輸出結果中是否包含某個字元,例如,「001」表示輸出結果中不含字元a、b,只含c,即輸出結果為c,而「101」,表示輸出結果為ac。原題就是要求輸出「001」到「111」這2^n-1個組合對應的字串。
程式**如下:
執行結果為:public class combinerecursiveimpl
}class solution4
int len=c.length;
boolean used=new boolean[len];
char cache=new char[len];
int result=len;
while(true)
}used[index]=true;
cache[--result]=c[index];
system.out.print(new string(cache).substring(result)+" ");
} }}
a b c ab ac bc abc
如何輸出字串的所有組合
問題描述 假如字串中所有字元都不重複,如何輸出字串的所有組合。例如 abca,結果應是a,b,c,ab,ac,bc,abc。最容易想到的就是遞迴了,但效率會變得很差,因為棧被呼叫了2 n次方,為了提高效率,可以構造乙個長度為n的01字串,表示輸出結果中是否包含某個字元,例如 001 c,010 b,...
01 輸出字串中字元的所有組合
1 def perm s 2 這裡是遞迴函式的出口,為什麼呢,因為這裡表示 乙個長度為1的字串,它的排列組合就是它自己。3if len s 1 4return s 5 sl 儲存字串的所有可能排列組合 6for i in range len s 這個迴圈,對應 解題思路1 確定字串的第乙個字母是誰,...
遞迴的應用,輸出字串的所有排列(java)
看到乙個題目 輸出乙個字串的所有排列。大致想了一下,覺得需要用到遞迴,而遞迴是我不太擅長的,所以就想練一下。在知道遞迴之前,容易想到的一種辦法是 假設字串為s,那麼寫乙個有s.length 層巢狀的迴圈形如 這個方法比較容易實現,演算法也簡單,但是有乙個前提 字串s的長度必須是已知的,否則就會不知道...