剑指offer 28:字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题思路

本题解题思路与存在重复数字的数组的全排列思路相同。需要完成排列去重的工作。因而工作分为两步。第一,确定当前数组元素的全排列;第二,对排列结果去重。

1.无论对于数组还是字符串,使用递归实现全排列的过程最容易,对于一个字符串而言,他的所有全排列可视为由第一个字符与剩余所有字符全排列的连接。而对于剩余字符,又可视为剩余字符中第一个字符,与其他剩余字符全排列的连接,依次递归。

2.对于去重,使用哈希地址映射,快速去重,简单讲就是使用set数据类型存储得到的所有全排列,最终set集合中得到的就是去重后的结果。

C++代码实现

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        int sz=str.size();
        if(sz==0){
              return result;
          }
        Permutation_sub(str,0,result);
        set<string> st(result.begin(), result.end());
        result.assign(st.begin(), st.end());
        return result;
    }
    void Permutation_sub(string &str, int begin, vector<string> &strlist){
        int sz=str.size();
        if(begin==(sz-1)){
            strlist.push_back(string(str));
        }
        else{
            for(int pos=begin;pos<sz;pos++){
                char tmp=str[pos];
                str[pos]=str[begin];
                str[begin]=tmp;
                Permutation_sub(str,begin+1,strlist);
                tmp=str[pos];
                str[pos]=str[begin];
                str[begin]=tmp;
            }
        }
    }
};
原文地址:https://www.cnblogs.com/fancy-li/p/11724890.html