一、排列
题目一
输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串“abc”,则输出由字符’a’、’b’、’c’所有排列出来的所有字符串”abc”、”acb”、”bac”、”bca”、”cab”和”cba”。
思路
从每个子串的第二个字符开始,依次与第一个字符交换,然后继续处理子串。也就是一个递归算法。如图所示(图是在网上找的):
另外,还要注意所给字符串中有重复字符的情况,可以增加一个函数进行判断。
代码
//
// Created by huxijie on 17-3-18.
// 字符串的全排列
#include <iostream>
using namespace std;
//交换字符
void Swap(string &src,int a,int b) {
if (a < 0 || a >= src.length() || b < 0 || b >= src.length()) {
cout<<"out of range"<<endl;
return;
} else {
char s = src.at(a);
src[a] = src.at(b);
src[b] = s;
}
}
//判断字符中在k-1之前是否有字符和k处字符相同,是则说明不用交换此字符了,因为前面一定已经处理过该相同字符了
bool IsDuplicated(const string src,int from,int k) {
int flag = 0;