示例:
輸入: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為例來分析...