剑指offer面试题28~字符串的排列问题及其扩展
一.字符串的排列问题
输入一个字符串打印出该字符串的所有排列,例如输入字符串"abc",则打印出由字符串"a,b,c"所能排列出的所有字符串:abc,acb,bac,bca,cab和cba。
如何求出这个字符串的所有排列序列呢?我们通过观察发现abc和acb这两个字符序列发现:这两个字符序列的第一个字符是相同的,只有后两个字符的位置进行了交换,后面的也是类似。
那仫就得到了求字符串全排列的方法了,就是将该字符串划分为两部分:第一部分就是该字符串的第一个字符,第二部分是后面的剩余字符。而我们在求字符串的全排列的过程中可以分为两步来实现:首先求所有可能出现在第一个位置的字符,就是将第一个字符和后面所有的字符交换;对于后面的剩余部分,我们依然将该字符串划分为两部分,后面剩余串的第一个字符和后面所有的字符,然后按照类似上面的方式进行交换。
有了实现的想法之后还可能存在什仫问题呢?就是去重的问题,如果给定的字符串是"abb"呢?由于第二个字符和第三个字符相等是不是就不用交换了呢?所以去重的实质就是:从第一个数起的每个数和它后面的非重复出现的字符交换
bool IsSwap(char *start,char *end)
{
char *cur=start;
while(cur != end)
{
if(*cur == *end)
return false;
++cur;
}
return true;
}
void RankPart(char *str,char *start)
{
static int count=0;
assert(str && start);
if(*start == '\0')
{
count++; //统计全排列字符的个数
cout<<count<<":"<<str<<endl;
}
else
{
char *ch=start;
while(*ch