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(
inout, 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(
inout, length, recursLev+1, i+1);
  }
}


 



 

 posted on 2009-03-08 16:16  清水湾  阅读(278)  评论(0)    收藏  举报