剑指offer26-字符串的排列
Posted trouble-easy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer26-字符串的排列相关的知识,希望对你有一定的参考价值。
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。(输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。)
思路:
字符串长度为n,
第二行,固定第一位,第一位元素与n位元素交换。有n个可能;
第三行,固定前两位,第二位元素与n-1位元素交换,上一层每个节点在第三层有n-1个可能;
...
第n行,固定前n-1位,第n-1位元素与两位元素交换。
void swap(string &str,int i,int j)
{
char c;
c=str[i];
str[i]=str[j];
str[j]=c;
}
vector<string> Permutation(string str) {
vector<string> res;
int begin=0;
Permutation(str,begin,res);
return res;
}
void Permutation(string str,int begin,vector<string>& res)
{
if(begin==str.size()-1)
{
res.push_back(str);
}
else{
for(int i=begin;i<str.size();i++)
{
if(begin!=i&&str[begin]==str[i])
{
continue;//重复元素跳过
}
swap(str,begin,i);
Permutation(str,begin+1,res);
}
}
}
{
char c;
c=str[i];
str[i]=str[j];
str[j]=c;
}
vector<string> Permutation(string str) {
vector<string> res;
int begin=0;
Permutation(str,begin,res);
return res;
}
void Permutation(string str,int begin,vector<string>& res)
{
if(begin==str.size()-1)
{
res.push_back(str);
}
else{
for(int i=begin;i<str.size();i++)
{
if(begin!=i&&str[begin]==str[i])
{
continue;//重复元素跳过
}
swap(str,begin,i);
Permutation(str,begin+1,res);
}
}
}
以上是关于剑指offer26-字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章