-2

例えば、

char str[20];
str="ABCD";

出力:

1 - A, B, C,D

2 -  AB,AC, AD BC, BD, CD.

3 - ABC, ABD, BCD.

4 - ABCD.

サブシーケンスは、左から右の方法でのみ生成されます。ありがとう :)

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


 int sub[10];

void next(int max, int length) {

    int pos = length - 1,a;

    //find first digit that can be increased
while(pos >= 0)
{
    if(sub[pos] == max - (length - 1 - pos))
        pos--;

    else
        break;
}

    sub[pos]++; //increase digit

    //update other digits
    for( a = pos+1; a < length; a++)
        sub[a] = sub[a-1] + 1;

}

int main()
{
char word[100];
printf("Enter a word = ");
scanf("%s",word);

int max = strlen(word) - 1,n,i,a,b; 


for(n=1; n <= max+1; n++)
{

    printf("\n");

    for(i = 0; i < n; i++)
    {
        sub[i] = i;
    }

    for(a = 0; ; a++)
    {               
        for(b=0; b < max+1; b++)
            printf("%c",word[sub[b]]);

        printf("\n");

        if(sub[0] == max - (n - 1))
            break;

        else
            next(max, n); 
    }   

    printf("\n");

}   


return 0;
}

このコードは、文字列の長さに等しい長さのサブシーケンスのみを生成し、特定の文字を繰り返します。

4

1 に答える 1

1

最もクリーンで最も効果的なコードではありませんが、これでうまくいきます:D

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

char *printForMask(int mask, char *str)
{
    int i = 0;
    int j = 0;
    char *maskedString = (char *)malloc(sizeof(char) * strlen(str) + 1); 
    for (; mask > 0; mask >>= 1, j++) {
            if (mask & 1)
                    maskedString[i++] = str[j];
    }   
    maskedString[i] = '\0';
    return maskedString;
}



int main()
{
    char str[20] = "ABCD";

    int mask = 1;
    int maskLen = 1;
    int stringLen = strlen(str);

    for (maskLen = 1; maskLen <= stringLen; maskLen++) {
            printf("%d ", maskLen);
            for (mask = (int)pow(2,maskLen) - 1; mask <= (int) pow(2, stringLen) - 1; mask <<= 1) {
                    char *temp = printForMask(mask, str);
                    printf ("%s%s", temp, (mask << 1 <= (int) pow(2, stringLen) - 1) ? ", " : "\n");
                    free(temp);
            }   
    }   
    return 0;
}

編集

文字列ABCDの場合

str[0] = 'A'
str[1] = 'B'
str[2] = 'C'
str[3] = 'D'

右?

したがって、私が行っているのは、整数のバイナリ表現を使用することです2^strlen(str) - 1 。この場合2^4 - 1 = 15 = 0b1111 、メイン関数の最初のforループで、マスクを増やします。つまりmask = 0b0001、ループの反復ごとに、を増やします。マスクをにmask = 0b1111 そして内側のforループで、このようなことが起こるようにマスクをシフトします

mask = 0b0001  //A
mask = 0b0010  //B
mask = 0b0100  //C
mask = 0b1000  //D
//The inner loop will finish here, and the mask length will become 2
mask = 0b0011  //AB
mask = 0b0110  //BC
mask = 0b1100  //CD
//etc.  The string representation is made by the function printForMask()
于 2013-01-28T11:50:59.953 に答える