题目
分析
举一个栗子,came
和acme
是非反片语,因为均由a、c、e、m
组成,题目给出一段话, 以#
结束,并以该段话为字典,以字典序输出该字典中的反片语。
思路
从举例可以看出,只需对每一个单词进行拆解为字母,并以此排序。输出时,由于已经排序,所以只要下一项与当前项相同,那么就不是反片语。
代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
char str[100][25], word[100][25];
int cmp(const void* a, const void* b)
{
return strcmp((char*)a, (char*)b);
}
int main(void)
{
char ch;
int i = 0, j = 0, k, len;
while ((ch = getchar()) != '#' ) {
if (isalpha(ch)) {
str[i][j] = ch;
j++;
} else if (j) {
str[i][j] = '\0';
i++;
j = 0;
}
}
qsort(str, i, sizeof(str[0]), cmp);
for (j = 0; j < i; j++) {
for (k = 0; k < strlen(str[j]); k++)
word[j][k] = tolower(str[j][k]);
qsort(word[j], strlen(str[j]), sizeof(char), cmp);
}
for (j = 0; j < i; j++) {
for (k = 0; k < i; k++) {
if (strcmp(word[j], word[k]) == 0 && j != k)
break;
}
if (k == i)
printf("%s\n", str[j]);
}
return 0;
}