老师要求写一篇题解,作为一个十分认真,踏实的学生,就用心的找道简单的题敷衍一下吧。
来看这道题
这道题既然在递归算法的标签下,就用递归来做吧。
先来捋一下思路,这道题,要求这几个字符的所有排列,
我们在小学六年级时就初步学过排列组合
排列n个互不相同的字符时 情况为A n n种
排列a时 情况只有一种 即a
排列ab时 就相当于在a的左边或右边插入b 情况有两种 ab ba
排列abc时 就是在排列ab的所有情况中,插入c
ab有3个地方可以插入c
cab acb abc
然后ba
cba bca bac
那么思路就很明显了
当长度为n时,就是在n-1的每种情况中,插入多出来的字符
排列之后别忘了给排列结果排序
我这里没看题目,结果多写了去重一步
为了方便,这里还用了结构体
代码如下
#include<iostream>
#include<cstdio>
using namespace std;
struct _sum
{
string text[1000];
int len = 0;
}tsum,fsum;
struct _sum f(string a, int len)
{
struct _sum sum;
if (len == 1)
{
sum.text[0] = a;
sum.len = 1;
return sum;
}
else
{
string t=a.substr(0,1);
a.erase(0, 1);
len--;
struct _sum lsum;
lsum = f(a, len);
int l = 0;
for (int i = 0; i < lsum.len; i++)
{
for (int j = 0; j <= lsum.text[i].length(); j++)
{
sum.text[l] = lsum.text[i].substr(0, j) + t + lsum.text[i].substr(j, lsum.text[i].length() - j);
l++;
}
}
sum.len = l;
return sum;
}
}
int main()
{
string a;
cin >> a;
int len = a.length();
tsum = f(a, len);
for (int i = 0; i < tsum.len; i++)
{
for (int j = 0; j < tsum.len - i - 1; j++)
{
if (tsum.text[j] > tsum.text[j + 1])
{
swap(tsum.text[j], tsum.text[j + 1]);
}
}
}
int l = 0;
for (int i = 0; i < tsum.len; i++)
{
int s = 0;
for (int j = 0; j < i; j++)
{
if (tsum.text[j] == tsum.text[i])
{
s = 1;
}
}
if (s == 0)
{
fsum.text[l] = tsum.text[i];
l++;
}
}
fsum.len = l;
for (int i = 0; i < fsum.len; i++)
{
cout << fsum.text[i] << endl;
}
return 0;
}