剑指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; } } } };