要輸出字元s從[start,end]間的全排列,只要將s[start,end]依次與s[start]替換並輸出s從[start+1,end]的全排列即可。
//遞迴輸出全排列
public static void fullpermutation(string s)
private static void permutation(char chararray,int start,int end)
}} }
private static void swapchar(char chararray,int index1 ,int index2)
}
非遞迴演算法:
(1)將字串s按公升序排序,輸出字串(2)從後往前找到第乙個相鄰非逆序對的第乙個元素的位置i(比如12354從後往前的第乙個相鄰非逆序對是25,位置是2,注:起始位置0),然後,從後往前查詢第乙個比s[i]大的元素的位置j(例子中是4所在的位置,即4),將s[i]和s[j]交換,並將s從i+1到結束按公升序排序,輸出字串(3)重複(2)直到s中的所有元素都是逆序,即(2)中的i為-1。
public static void fullpermutationwithoutrecursion(string s)
char chararray = s.tochararray();
quicksort(chararray,0,chararray.length - 1);
outputarray(chararray);
while(true)
swapchar(chararray,i,j);
quicksort(chararray,i+1,chararray.length-1);
outputarray(chararray);
} } public static void quicksort(char chararray,int begin,int end)
{ if(begin < end)
{ int flag = begin + (int)math.ceil(math.random()*(end - begin));
char tmp = chararray[flag];
swapchar(chararray,flag,end);
int i = begin,j = end;
while(i < j)
{while(itmp)
--j;
if(i
遞迴的應用,輸出字串的所有排列(java)
看到乙個題目 輸出乙個字串的所有排列。大致想了一下,覺得需要用到遞迴,而遞迴是我不太擅長的,所以就想練一下。在知道遞迴之前,容易想到的一種辦法是 假設字串為s,那麼寫乙個有s.length 層巢狀的迴圈形如 這個方法比較容易實現,演算法也簡單,但是有乙個前提 字串s的長度必須是已知的,否則就會不知道...
字串逆置(遞迴和非遞迴)
單鏈表逆置 遞迴 要時時刻刻記著,我們要返回的是當前鍊錶的尾結點,這樣的話if和else中的內容就很清楚了。逆置單鏈表,返回原單鏈表的尾結點。linklist reverserecursive linklist l return reversehead 單鏈表逆置 非遞迴 根據劍指offer上的講述...
C C 18 3 遞迴反向輸出字串
遞規反向輸出字串的例子,可謂是反序的經典例程 遞規反向輸出字串 include include include include include using namespace std void inverse char p int main 對於檔案操作 遞規反向輸出字串 檔案為逐行倒敘 inclu...