再次。我写了一个代码来查找一个单词上所有可能的组合,我的代码可以工作,但次数非常有限(即,它打印的字符串中“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”是问题所在,但我找不到控制它的方法。
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;
}