劍指offer刷題————字符串的排列

問題重述:

題目:輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a、b、c所能排列出來的所有字符串abc、acb、bac、bca、cab和cba。

思路解析:

可以將字符串看成兩部分,第一個字符看成第一部分,後面的字符看成第二部分。並且依次將第二部分的第一個字符和第一部分交換。同時對第二部分遞歸的進行操作即可。

由於題目並沒有說明字符都是不重複的,因此在得到結果之後要進行去重,才能夠進行返回。詳見代碼。

代碼實現:

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.empty())
            return result;
        
        int i = 0;
        recursion(result,str,i);
        //結果去重
        set<string> s;
        for(auto e:result)
        {
            s.insert(e);
        }
        result.clear();
        for(auto e:s)
        {
            result.push_back(e);
        }
        return result;
    }
    void recursion(vector<string> &result,string& str,int index)
    {
        if(index>=str.size())
            return;
        
        for(int i = index;i<str.size();++i)
        {
            char temp;
            temp = str[index];
            str[index]=str[i];
            str[i]=temp;
            result.push_back(str);
            //遞歸的進行操作
            recursion(result, str, index+1);
            //爲了保證是第二部分的第一個字符和第一部分進行交換,需要將交換過的換回來
            temp = str[index];
            str[index]=str[i];
            str[i]=temp;
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章