字符串 数组

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 ;
      }
}

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 );
  }
}


 



 

你可能感兴趣的:(字符串)