輸入乙個字串,列印出該字串中字元的所有排列。
你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。
示例:
限制:輸入:s = "abc"
輸出:["abc","acb","bac","bca","cab","cba"]
1 <= s 的長度 <= 8
通過次數30,289提交次數55,865
思路:
回溯法。這道題應該這樣來理解,對於每乙個位置,在向下搜尋的過程中,固定住前面的每乙個位置,這樣對當前的位置,就只有當前位置之後的可能性,因此,考慮將當前位置的元素與其之後的元素依次交換並向下遞迴搜尋,這樣就可以在每個位置固定不同的元素。當每次固定到末尾的時候,就等於找到了一種可能性。至於對重複答案的排除,考慮出現重複答案的原因,是在某個位置上固定了陣列中原本有的重複的元素,在他們之後的分支就會全部重複,因此,在遞迴內部,即將當前元素依次與之後元素交換並固定的過程中,使用乙個set來確保每乙個位置在乙個向下的分支中只會出現一次,這樣就不會出現重複的元素了。
class
solution
void
dfs(
int x)
set<
char
> charset;
for(
int i = x;isize()
;i++)}
void
swap
(int a,
int b)
};
劍指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 1 最蠢的遞迴 class solution public void f string s,st...