剑指offer:字符串的排列
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路:
这题需要用分治思想,递归解决。
把一个字符串看成两部分组成:第一部分为第一个字符,第二部分为后面的所有字符。
求整个字符串的排列,可以看出两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换;然后固定第一个字符,求后面所有字符的排序。此时仍把后面的字符看成两部分,第一个字符和后面的字符,然后重复上述步骤。(递归)
注意可能有重复的字符,需要判断一下,略过。
代码:
class Solution { public: void Permutation_once(vector<string>& s, string str, int start) { if(start == str.size()-1) s.push_back(str); for(int i=start; i<str.size(); i++) { if(i!=start && str[start]==str[i]) { continue; } swap(str[start], str[i]); Permutation_once(s, str, start+1); swap(str[i], str[start]); } } vector<string> Permutation(string str) { vector<string> s; if(str.length()==0) return s; Permutation_once(s, str, 0); sort(s.begin(), s.end()); return s; } };