左神算法基础class8—题目4打印字符串的全排列
1.题目:打印一个字符串的全部排列
2.分析
先固定字符串的第一个元素,再求解剩余字符串的全排列,求解方法又和本问题相同,递归解题
①遍历所有可能出现的首字符:使用交换的方法,按顺序依次交换其他元素与第一个元素
②固定住第一个元素,再递归第二个起的元素
③结束条件是当前递归的元素是最后一个元素:索引为字符串长度减一
3.完整代码
#include<iostream>
#include<string>
using namespace std;
void swap(char &a,char &b)
{
char tmp = a;
a = b;
b = tmp;
}
void print(string s,int beg)
{
if(beg == s.size() - 1)
{
cout << s << endl;
return ;
}
else
{
for(int i = beg; i < s.size();i++)
{
swap(s[i],s[beg]); //交换
print(s,beg + 1); //递归
swap(s[i],s[beg]); //回溯,交换回来
}
}
}
int main()
{
string s = "abc";
print(s,0);
return 0;
}
4.结果及额外要求
注:
1.本题没要求去重,如果需要去重可以
①将要输出时的字符串加入set容器中,查找没有再输出
②使用vector 进行存储所有的串,在find函数中查找,没有时再输出
2.要求按照字典序输出,main()函数中先使用sort函数对字符串排序,再继续