题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
求整个字符串的排列,可以看成两步:
(1).首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。
(2).固定第一个字符,求出后面字符的排列,方法参考(1)
代码:
class Solution
{
public:
vector<string> array;
vector<string> Permutation( string str )
{
if ( str.size() == 0 )
return array;
per( str, 0 );
sort( array.begin(), array.end() );
return array;
}
void per( string str, int begin )
{
if ( begin == str.size()-1 )
array.push_back( str );
for ( int i = begin; i < str.size(); i++ )
{
if ( i == begin || str[i] != str[begin] )
{
swap( str[i], str[begin] );
per( str, begin+1 );
swap( str[begin], str[i] );
}
}
}
};
本题拓展
将本题中求字符的所有排列改成求字符的所有组合。
Note:如果输入三个字符a b c,则它们的组合有a b c ab ac bc abc.
class Solution
{
public:
//vector<string> array;
//string temp;
void Combination( char *string )
{
assert( string != NULL );
vector<char> result;
int i, length = strlen( string );
for ( i = 1; i <= length; ++i )
Combination( string, i, result );
}
void Combination( char *string, int number, vector<char> &result )
{
assert( string != NULL );
if ( number == 0 )
{
static int num = 1;
printf( "%d : \t", num++ );
vector<char>::iterator iter = result.begin();
for ( ; iter != result.end(); ++iter )
printf( "%c", *iter );
printf( "\n" );
return;
}
if ( *string == '\0' )
return ;
result.push_back( *string );
Combination( string+1, number-1, result );
result.pop_back();
Combination( string+1, number, result );
}
};
int main( void )
{
char str[] = "abc";
Solution sos;
sos.Combination( str );
return 0;
}
相关题目
八皇后问题
#include <iostream>
using namespace std;
int g_number = 0;
void Permutation( int *, int, int );
void Print( int *, int );
void eightQueen()
{
const int queens = 8;
int ColumnIndex[queens];
for ( int i = 0; i < queens; ++i )
ColumnIndex[i] = i;
Permutation( ColumnIndex, queens, 0 );
}
bool Check( int ColumnIndex[], int length )
{
int i, j;
for ( i = 0; i < length; ++i )
{
for ( j = i+1; j < length; ++j )
{
if ( i - j == ColumnIndex[i] - ColumnIndex[j]
|| j - i == ColumnIndex[i] - ColumnIndex[j] )
return false;
}
}
return true;
}
void Permutation( int ColumnIndex[], int length, int index )
{
if ( index == length )
{
if ( Check( ColumnIndex, length ) )
{
++g_number;
Print( ColumnIndex, length );
}
}
else
{
for ( int i = index; i < length; ++i )
{
swap( ColumnIndex[index], ColumnIndex[i] );
Permutation( ColumnIndex, length, index+1 );
swap( ColumnIndex[index], ColumnIndex[i] );
}
}
}
void Print( int ColumnIndex[], int length )
{
printf( "%d\n", g_number );
for ( int i = 0; i < length; ++i )
printf( "%d ", ColumnIndex[i] );
printf( "\n" );
}
int main( void )
{
eightQueen();
return 0;
}