0

我试图找到一个字符串的所有可能的子序列。例如这个字符串中的“abc”,我们将找到总共 8 个字符串 2^3=8 个组合。像 a, b, c, ab, ac, bc, abc '\0'。但我的代码只打印字符串的所有字符。我怎样才能做到这一点?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char string[1000];
    int count, i;
    gets(string);
    int len = strlen(string);
    for(i=0; i<len; i++) {
        printf("%c ", string[i]);
    }
    return 0;
}
4

2 回答 2

0

您可以做的是将字符串视为一个集合并使用以下算法打印所有子集

#include <stdio.h>
#include <string.h>

int include[1000];
int n;
char s[1000];
int count=1;
void subsets(int i)
{   int j;
    if(i==n){
        int f=0;

        char temp[1000]="";
        int cnt=0;
        for(j=0;j<n;++j){

            if(include[j]){

                temp[cnt]=s[j];

                if(cnt>0 && temp[cnt]==temp[cnt-1]){ f=1; break;}
                ++cnt;

            }
        }
        temp[cnt]='\0';
        if(!f){ printf("%d =",count); printf("%s\n",temp);  
        ++count;}

     //printf("\n");
   }
    else{
        include[i] = 1;      // This element will be in the subset
        subsets(i + 1);
        include[i] = 0;     // This element won't be in the subset
        subsets(i + 1);
  }
}





void main(){

    scanf("%s",s);
   // printf("%s",s);
    n=strlen(s);
    subsets(0);

}
于 2014-05-25T12:35:06.647 回答
0

据我了解,您需要一个完全不同的循环。您将遍历i字符串中的所有位置;每个位置的字符要么被打印,要么不被打印。这个问题可以通过递归来解决,这可能比使用迭代方法更容易。

于 2014-05-25T12:31:32.157 回答