字符串的排列

https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

 

输入一个字符串,打印出该字符串中字符的所有排列。

 

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

 

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

 

限制:

1 <= s 的长度 <= 8

 

问题思路:

1.每次选取一个出队,可以将问题划分为子问题。

2.每次出队固定第x位,然后和所有其他位交换使得同级问题被全部找出。

3.使用set去重,只有连着的两位才是不会重复的

class Solution {
public:
    // 当前进入的s, 
    vector<string> ans;
    void dfs(string s, int x){
        if(x == s.length()-1){

            ans.push_back(s);
            return;
        }
        set<int> st;
     

     //每次固定第x位
for(int i=x; i<s.length(); i++){ //当不为连着的时候都是重复。 if(st.find(s[i])!=st.end()) continue; st.insert(s[i]); swap(s[i], s[x]); dfs(s, x+1);
       // 可以不恢复现场,因为本题思路全部向下拆解为所有子问题。 swap(s[i], s[x]); }
return; } vector<string> permutation(string s) { dfs(s, 0); return ans; } };
posted @ 2021-06-22 23:29  会飞的雅蠛蝶  阅读(52)  评论(0编辑  收藏  举报