劍指 Offer 38 字串的排列

2021-10-09 12:44:00 字數 1274 閱讀 4949

輸入乙個字串,列印出該字串中字元的所有排列。

你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。

示例:

輸入:s = "abc"

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

限制:

1 <= s 的長度 <= 8

1、最蠢的遞迴

class solution

public void f(string s,string buff,setres)

for (int i = 0; i < s.length(); i++)

}}

2、利用決策樹進行dfs。

注意剪枝

class solution 

private void dfs(int x)

//為了防止同一層遞迴出現重複元素

hashsetset = new hashset<>();

//這裡就很巧妙了,第一層可以是a,b,c那麼就有三種情況,這裡i = x,正巧dfs(0),正好i = 0開始

// 當第二層只有兩種情況,dfs(1)i = 1開始

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

set.add(c[i]);

//交換元素,這裡很是巧妙,當在第二層dfs(1),x = 1,那麼i = 1或者 2, 不是交換1和1,要就是交換1和2

swap(i,x);

//進入下一層遞迴

dfs(x + 1);

//返回時交換回來,這樣保證到達第1層的時候,一直都是abc。這裡捋順一下,開始一直都是abc,那麼第一位置總共就3個交換

//分別是a與a交換,這個就相當於 x = 0, i = 0;

// a與b交換 x = 0, i = 1;

// a與c交換 x = 0, i = 2;

//就相當於上圖中開始的三條路徑

//第乙個元素固定後,每個引出兩條路徑,

// b與b交換 x = 1, i = 1;

// b與c交換 x = 1, i = 2;

//所以,結合上圖,在每條路徑上標註上i的值,就會非常容易好理解了

swap(i,x);}}

private void swap(int i, int x)

}

劍指Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。例 輸入 abc 輸出 abc acb bac cab cba 長度為n的字串的排列若是集合s,其中一種排列的字串為 s2,sn s2 sn 再插入sn 1s sn 1 則有對於乙個字串有n 1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全...

劍指 Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba class solution boolean visited new boolean s.length dfs s,vis...

劍指 Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba 限制 1 s 的長度 8 通過次數30,289提交次數55,865 思路 回溯法。這道題應該這樣來理解,對於每乙個位置,在...