1 全排序
请编写一个函数,用它把字符串中所有的字符的各种排列形式全部都显示出来;换句话说,用给定的字符串里的字符做全排列。
   比如给定的字符串是"hat"
   则输出 "tha","aht","tah","ath","hta","hat"
   字符串中的每一个字符是不相干的,即使有重复出现的,也把他们当成不一样的。
如"aaa" 要输出六个 "aaa"
int Permute(char inString[])
{
int length = 0;
int i=0;
int *used=NULL;
int *out = NULL;
length = strlen(inString);
out = (char*)malloc( length+1);
if(!out)
return 0;
out[length] = '\0';
used = (int*)malloc( sizeof(int) * length );
if(!used)
return 0;
   
for(i=0; i<length; i++)
used[i]=0;
DoPermute( inString, out, used, length, 0 );
free(out);
free(used);
return 1;
}
void DoPermute(char in[], char out[], int used[], int length, int recursLev)
{
int i;
if(recursLev == length) // base case
{
printf("%s \n", out);
return;
}
      
for(i =0; i< length; i++)
{
if(used[i])
continue;
out[recursLev] = in[i];
used[i]=1;
DoPermute(in, out, used, length, recursLev+1);
used[i] = 0;
}
}
{
int length = 0;
int i=0;
int *used=NULL;
int *out = NULL;
length = strlen(inString);
out = (char*)malloc( length+1);
if(!out)
return 0;
out[length] = '\0';
used = (int*)malloc( sizeof(int) * length );
if(!used)
return 0;
for(i=0; i<length; i++)
used[i]=0;
DoPermute( inString, out, used, length, 0 );
free(out);
free(used);
return 1;
}
void DoPermute(char in[], char out[], int used[], int length, int recursLev)
{
int i;
if(recursLev == length) // base case
{
printf("%s \n", out);
return;
}
for(i =0; i< length; i++)
{
if(used[i])
continue;
out[recursLev] = in[i];
used[i]=1;
DoPermute(in, out, used, length, recursLev+1);
used[i] = 0;
}
}
2)字符串的全组合
编写一个函数, 用它把字符串中所有字符的各种形式组合全部都显示出来。 各种组合的长度范围从一个字符到字符串的长度。不管排列顺序如何,只要两种组合的字符完全一样,则认为是同一种组合。 
如 "123" "12" 和"21" 是同一种组合。
int Combine(char inString[])
{
int length;
char *out;
length = strlen(inString);
out = (char*)malloc(length+1);
if(!out)
return 0;
DoCombine(inString, out, length, 0,0);
free(out);
return 1;
}
 
void DoCombine(char in[], char out[], int length, int recursLev,int start)
{
int i;
for(i=start, i<length; i++)
{
out[recursLev]=in[i];
out[recursLev+1] = '\0';
printf("%s \n", out);
if(i<length-1)
DoCombine(in, out, length, recursLev+1, i+1);
}
}
{
int length;
char *out;
length = strlen(inString);
out = (char*)malloc(length+1);
if(!out)
return 0;
DoCombine(inString, out, length, 0,0);
free(out);
return 1;
}
void DoCombine(char in[], char out[], int length, int recursLev,int start)
{
int i;
for(i=start, i<length; i++)
{
out[recursLev]=in[i];
out[recursLev+1] = '\0';
printf("%s \n", out);
if(i<length-1)
DoCombine(in, out, length, recursLev+1, i+1);
}
}
 
                    
                     
                    
                 
                    
                 
 posted on
 posted on 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号