-6

Given a set of characters and a positive integer p, I have to print all possible strings of length p that can be formed from the given set.

for eg: if the set is {a,b}
 and the value of p is 2

Output is: aa,ab,ba,bb

I know that for a given set of size n, there will be np possible strings of length p.

What is the best method that can be used to print all the possible strings.? I just want an approach to solve.

I'm using C.

4

3 回答 3

3

一种可能的方法是从一个空字符串开始,使用递归函数一个一个地添加字符并打印它。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void print_string(char str[],char new_str[],int current_len,int n,int len)
{
    /*
    str=orignal set,
    new_str=empty char array,
    current_len=0(Intially)
    n=no of elements to be used
    len=the value of p given*/
    if(current_len==len)//print string when length is equal to p
    {
        printf("%s\n",new_str);
        return;
    }
    else
    {
        int i;
        for(i=0;i<n;i++)
        {
            new_str[current_len]=str[i];
            print_string(str,new_str,current_len+1,n,len);
        }
    }
}
int main()
{
    char set[]={'a','b'};
    char arr[10]="";
    print_string(set,arr,0,2,2);
    return 0;
}

输出:

aa
ab
ba 
bb
于 2013-07-06T20:35:01.560 回答
2

您想按字典顺序列出您的字符串。最快的方法(和最小的内存使用)是实现一个函数来计算给定字符串的下一个字符串。这是一些诱人的代码:

char first_char='a';
int n_chars = 2;
int p=2;

char result[100];

int i,j;

/* fill-in first string */
for(i=0;i<p;++i) result[i]=first_char;
result[i]=0; /* string terminator */

printf("%s\n",result); /* print first string */
while(1) {
  /* find last character of result which can be incremented
  for (j=p-1;j>=0 && result[j]!=first_char + n_chars -1;j--);
  if (j<0) break; /* this was the last string */

  result[j]++; /* increment j-th character
  for(j++;j<p;++j) result[j]=first_char; /* reset following chars */

  /* print current string */
  printf("%s\n",result);
}
于 2013-07-06T20:34:25.533 回答
2

你可以使用一个向量,我们称之为:string [ p ]。如果 p 代表例如。7、你会得到:string = [ 0, 0, 0, 0, 0, 0, 0]。

索引 0 用于第一个字符,索引 1 用于第二个字符,依此类推,直到 N。对于字符串:“smthing”,您将拥有:0 - s、1 - m、2-t、3-h、4-我,5-n,6-g。

您可以使用 : while ( all elements in string != 'n' ) { 作为初始字符串 ( string[p]={0} ),您将拥有 : "sssssss" ,这是我们构建的第一个字符串,直到是。您将始终在每个循环的索引处添加 +1,如果 index = n,您将重置它,例如 [0 0 9] -> [0 1 0] 如果 n=9 为例。..通过解释我描述的索引,您将拥有所有可能的组合;}

于 2013-07-06T20:44:32.133 回答