/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q:
字符串的排列:
输入一个字符串,打印出该字符串的所有排列。
S:
把一个字符串分成两部扽,第一部分是第一个字符,然后是第二部分的剩下字符串;
采用递归方法,剩下的字符串也这样划分;在每次划分的时候把第一部分的第一个字
符跟第二部分的所有字符串都交换。
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
void divide_permutation(char*str, char*begin)
{
if((*begin) == '\0')
{
std::cout << str << std::endl;
}
for(char*ch = begin; (*ch) != '\0'; ++ch)
{
char tmp = *begin;
*begin = *ch;
*ch = tmp;
divide_permutation(str, begin+1);
tmp = *begin;
*begin = *ch;
*ch = tmp;
}
}
void permutation(char*str)
{
if(str == nullptr)
return;
divide_permutation(str, str);
}
void test_1()
{
std::cout << "Test 1" << std::endl;
char str[] = "abc";
permutation(str);
std::cout << std::endl;
}
void test_2()
{
std::cout << "Test 2" << std::endl;
char str[] = "a";
permutation(str);
std::cout << std::endl;
}
void test_3()
{
std::cout << "Test 3" << std::endl;
char str[] = "abcd";
permutation(str);
std::cout << std::endl;
}
void test_4()
{
std::cout << "Test 4" << std::endl;
char str[] = "";
permutation(str);
std::cout << std::endl;
}
void test_5()
{
std::cout << "Test 5" << std::endl;
char*str = nullptr;
permutation(str);
std::cout << std::endl;
}
void test_permutation()
{
test_1();
test_2();
test_3();
test_4();
test_5();
}
int main(int argc, char**argv)
{
test_permutation();
return 0;
}