字串的排列

2021-10-09 17:38:35 字數 1249 閱讀 1789

示例:

輸入:s = "abc"

輸出:["abc","acb","bac","bca","cab","cba"]

2.1  思路分析

排列方案數量:對於乙個長度為n的字串(假設字元互不重複),其排列共有 n! 種;

排列方案的生成方法:根據字串排列的特點,考慮深度優先搜尋所有排列方案。即通過字元交換,先固定第1位字元(n種情況)、再固定第2位字元(n-1種情況)、...、最後固定第n位字元(1種情況);

重複方案與剪枝:當字串存在重複字元時,排列方案中也存在重複方案。為排除重複方案,需在固定某位字元時,保證"每種字元只在此位固定一次",即遇到重複字元時不交換,直接跳過。從dfs的角度看,此操作稱為"剪枝"。

2.2  演算法流程

終止條件:當x = len(c)-1時,代表所有位已固定(最後一位只有一種情況),則將當前組合c轉化為字串並加入res並返回;

遞推引數:當前固定位x;

遞推工作:初始化乙個set,用於排除重複的字元;將第x位字元與 i∈[x,len(c)] 字元分別交換,並進入下層遞迴;

1.剪枝:若c[i]在在set中,代表其是重複字元,因此"剪枝";

2.將c[i]加入set,以便之後遇到重複字元時剪枝; 

3.固定字元:將字元c[i]與c[x]交換,即固定c[i]為當前位字元;

4.開啟下層遞迴:呼叫dfs(x+1),即開始固定第x+1個字元;

5.還原交換:將字元c[i]和c[x]交換(還原之前的交換);

2.3  **實現

class solution 

//開始固定字元

void dfs(int x)

//判斷固定字元時是否有重複元素

hashseths = new hashset<>();

for(int i = x; i < c.length; i++)

}void swap(int i,int x)

}

2.4  複雜度分析

字串排列

在網上看到了乙個操作字串的題目,該題為 字串排列。大概意思是列出字串中所有字元的所有組合並且輸出無重複。自己做了一下,這裡分享該題的思路,和做法。自我覺得實現的有些麻煩 歡迎指點。問題輸入乙個字串,列印出該字串中字元的所有排列。輸入 字串abc。輸出 列印出由字元a,b,c所能排列出來的所有字串ab...

字串排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。第一種方法 字串拼接 function permutate str else return result console.log pe...

字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元 abc為例來分析...