查找单词的可能排列

问题描述 投票:0回答:1

再次。我写了一个代码来查找一个单词上所有可能的组合,我的代码可以工作,但次数非常有限(即,它打印的字符串中“a”仅被交换(我的 I/P 是 abcd),但不是 b、c 和d.

代码已附上。我恳求你帮助我。

#include<stdio.h>

void combination(char *,int,int);
int my_strlen(char *);
int main()
{
    char s[10];
    scanf("%[^\n]",s);
    int n=my_strlen(s);
    combination(s,0,n-1);
    return 0;
}
void combination(char *s,int i,int n)
{
    char c[10];
    for(int j=0;j<=n;j++)
        c[j]=s[j];
    int cn=0,k=0,l=0;
    while(s[k]!='\0')
    {
        i=0,cn=0;
        while(s[i]!='\0')
        {
            if(s[i]==c[i])
                cn++;
            i++;
        }
        if(--cn==n)
        {
            int m=l;
            while(m<n)
            {
                char temp=s[m];
                s[m]=s[m+1];
                s[m+1]=temp;
                printf("%s\n",s);
                m++;
            }
            l++;
        }
        k++;
    }
}
int my_strlen(char *s)
{
    int i=0,c=0;
    while(s[i++]!='\0')
        c++;
    return c;
}

我知道我的逻辑不完整,但我预计至少有 18 个组合而不是 24 个,但它也不会那样(它只打印 3 个)。因此,我请求我的代码帮助我完成我的代码,因为我刚刚开始深入研究字符串概念。我相信控制“k”是问题所在,但我找不到控制它的方法。

c combinations permutation c-strings cpu-word
1个回答
0
投票

string.h 中有一个 strlen 功能,所以我正在使用它。 除此之外,您的代码问题是您只交换第一个字符。为了解决这个问题,我使用递归。

将一个字符与第一个字符交换,然后再次递归调用我的排列方法。这段代码适用于没有重复字符的字符串,要使其适用于具有重复字符的字符串,会稍微复杂一些。

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

void swap(char *x, char *y) {
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

void permute(char *a, int l, int end) {
    int i;
    if (l == end)
        printf("%s\n", a);
    else {
        for (i = l; i <= end; i++) {
            swap((a+l), (a+i));
            permute(a, l+1, end);
            swap((a+l), (a+i)); 
        }
    }
}

int main() {
    char str[10];
    scanf("%[^\n]", str);
    int n = strlen(str);
    permute(str, 0, n-1);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.