给定一组字符和一个正整数p,我必须打印所有可能由给定集合形成的长度为p的字符串。
for eg: if the set is {a,b}
and the value of p is 2
Output is: aa,ab,ba,bb
我知道对于给定的大小为n的集合,将有n p 可能的长度为p的字符串。
可用于打印所有可能字符串的最佳方法是什么?我只想要一种方法来解决。
我正在使用C.
答案 0 :(得分: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
答案 1 :(得分: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);
}
答案 2 :(得分:2)
你可以使用一个向量,我们称之为:string [p]。 如果p是例如。 7,你将拥有: string = [0,0,0,0,0,0,0。
索引0,用于第一个char,索引1用于第二个,依此类推,直到N. 对于字符串:“smthing”,你将有:0 - s,1 - m,2-t,3-h,4-i,5-n,6-g。
您可以使用:while(字符串中的所有元素!='n'){ 对于初始字符串(字符串[p] = {0}),您将拥有:“sssssss”,我们构建的第一个字符串,直到是。 你总是在每个循环的索引处添加+1,如果index = n,你将重置它,就像这个[0 0 9] - &gt; [0 1 0]如果n = 9则为例。 ..并且你将通过解释我所描述的索引来获得所有可能的组合; }