剑指offer刷题笔记
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
该题采取递归思路
首先找到所有可能在第一个位置的可能的字符。即第一个字符和后面不相同的字符进行交换,变得几个新的序列。
可以将序列分成两部分,第一部分是第一个字符,即所有的可能,第二部分就是第二个字符开始后面的子字符串,将该子字符串做类似的操作。当子字符串长度等于0的时候,就添加到结果当中。
源代码:
class Solution {
public:
vector<string> Permutation(string str) {
if(str.length()==0){
return result;
}
PermutationCore(str,0);
sort(result.begin(),result.end());
return result;
}
void PermutationCore(string str,int begin){
if(str.length()==begin){
result.push_back(str);
return;
}
for(int i=begin;i<str.length();i++){
if(i!=begin && str[i]==str[begin])
continue;
//所有在i的可能
swap(str[i],str[begin]);
//递归子数列
PermutationCore(str,begin+1);
}
}
private:
vector<string> result;
};
总结:
这段时间一直在为毕业设计做准备,刷题的频率渐渐降低了。这道题没有马上的找到思路,看了答案也没能够马上理解。希望接下来可以做到一天两题或者一题的强度。