您的位置:首页 > 编程语言 > C语言/C++

字符串的排列

2017-05-15 21:45 211 查看
题目描述:

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


输入描述:

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

这个题,一开始其实没有思路,参考了剑指offer上的思路自己写出来了,关键的思想就是递归该怎么设计,把问题分为两步:1、求可能出现的第一个位置的字符,即把第一个字符和后面所有的字符交换;2、固定第一个字符,求后面所有字符的排列。

代码:

class Solution {
public:
vector<string> Permutation(string str) {
vector<string> res;
if(str.empty())
return res;
string tmp="";
recur(str,res,tmp,0);
return res;
}
void recur(string str,vector<string> &res,string &tmp,int start){
if(start==str.size()){
res.push_back(tmp);
return;
}
for(int i=start;i<str.size();i++){
//判断要交换的字符是否相同,相同就不用交换直接跳过(除了start位置与自己交换的情况)
if(i!=start&&str[start]==str[i])
continue;
swap(str[start],str[i]);
tmp+=str[start];
recur(str,res,tmp,start+1);
tmp.pop_back();
}
}
};


相关题目:1、求字符的所有组合,例如a,b,c三个字符的组合:a,b,c,ab,ac,bc,abc

可以对不同长度的组合分别求

2、八皇后问题

思路:每个皇后肯定不同行,另外对0-7全排列,初始化,则每个皇后也不同列,接下来只要判断每个排列是否在同一条对角线
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 剑指offer 递归