查找并计算字符串的所有子序列

时间:2014-05-25 12:27:20

标签: c string subsequence

我正在尝试查找字符串的所有可能子序列。例如,在该字符串中的“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;
}

2 个答案:

答案 0 :(得分:0)

根据我的理解,你需要一个完全不同的循环。你会遍历字符串中的所有位置i;每个位置的角色都可以打印或不打印。这个问题可以通过递归来解决,这种迭代比使用迭代方法更容易。

答案 1 :(得分: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);

}