这就是我要解决的问题。(给定一个2n长度的不同字符字符串,我必须以所有可能的方式将其分成两部分,而不必重复分组)。
我使用的方法是:
生成字符串的所有置换。
存储可接受的排列(我正在生成“hauy”和“hayu”,但只存储其中一个)。
将新生成的排列与存储的排列进行比较,以筛选出重复的排列。
打印
(我意识到也许有更好的方法来做这件事)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *b[100000000];
int bSize = 0;
void print(char *a)
{
int k = strlen(a);
printf("M: ");
for(int i=0 ; i<k/2 ; i++)
{
printf("%c ", a[i]);
}
printf("| B: ");
for(int i=0 ; i<k/2 ; i++)
{
printf("%c ", a[k/2 + i]);
}
printf("\n");
}
void check(char *a)
{
int k = strlen(a);
for(int i=0 ; i<bSize ; i++)
{
int c = 0;
for(int j=0 ; j<k/2 ; j++)
{
for(int m=0 ; m<k/2 ; m++)
{
if(a[m] == b[i][j])
{
c++;
break;
}
}
}
for(int j=0 ; j<k/2 ; j++)
{
for(int m=0 ; m<k/2 ; m++)
{
if(a[m + k/2] == b[i][j + k/2])
{
c++;
break;
}
}
}
if(c == k)
{
break;
}
else
{
b[bSize] = a;
bSize++;
print(a);
}
}
}
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void permute(char *a, int start, int end)
{
if(start == end)
if(bSize == 0)
{
print(a);
b[bSize] = a;
bSize++;
}
else
check(a);
else
{
for(int i=start ; i<=end ; i++)
{
swap((a+start), (a+i));
permute(a, start+1, end);
swap((a+start), (a+i));
}
}
}
int main()
{
int n;
scanf("%d", &n);
char f;
scanf("%c", &f);
char A[n];
for(int i=0 ; i<n-2 ; i++)
{
char c;
scanf("%c", &c);
if(c == ' ' || c == 'M' || c == 'B')
i--;
else
A[i] = c;
}
A[n-2] = '\0';
permute(A, 0, n-3);
return 0;
}
当我运行这个时,只有一行作为输出。我认为错误在于
b[]
。在check
函数中b[0]
和a
总是相等的。并且bSize
永远不会超过1。我不明白为什么。 最佳答案
b[bSize] = a;
将a
的值存储在b[bSize]
中。a
是指向A
中定义的数组的第一个元素的指针。因此,您不存储单个字符串,只存储指向main
的指针,而且该指针永远不会更改。
要使用此算法,必须复制每个字符串。这需要更改如何定义A
以及如何比较字符串。(不能将字符串与b
进行比较)
(但是,对于这个任务,有一个更好的算法,它不需要生成所有的排列。)