查找兄弟单词

查找兄弟单词

题目

img

img

img

题目出处

思路

先存储,再排序,按要求依次查找,重点在如何按要求查询单词。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#pragma warning(disable : 4996) //忽略scanf的安全警告

int comp(const void* a, const void* b) //用于快速排序的辅助函数,比较字符串
{
const char* a1 = (const char*)a;
const char* b1 = (const char*)b;
return strcmp(a1, b1);
}

int main(void)
{
int a;
while (scanf("%d", &a) != EOF) {
int b = 0, c, d = 0, i, j, flag;
char book[1000][51]; //二维数组当字典
char word[51];
char copy[51];
int num[1000];
char* p;
//while (getchar() != ' ');
for (i = 0; i < a; i++)
{
scanf("%s", book[i]); //字典存储单词
//while (getchar() != ' ');
}
scanf("%s", word); //待查找的单词
//while (getchar() != ' ');

qsort(book, a, sizeof(char) * 51, comp); //对字典排序
for (j = 0, b = 0; j < a; j++)
{
flag = 1; //判断是否查找到兄弟单词
strcpy(copy, book[j]);
for (i = 0; i < strlen(word); i++)
{
if (strcmp(copy, word) == 0) //排除完全相同的
{
flag = 0;
break;
}
if (strlen(copy) != strlen(word)) //排除长度不同的
{
flag = 0;
break;
}
if ((p = strchr(copy, word[i])) == NULL) //排除不该单词的字符的
{
flag = 0;
break;
}
if ((p = strchr(copy, word[i])) != NULL) //依次查找字典含有该单词的字符
*p = '2'; //已查找过的字符设为无关项


}
if (flag == 1)
{
num[b++] = j; //按顺序存储兄弟单词在字典中的位置
d++; //统计兄弟单词数目
}
}
printf("%d\n", d);

scanf("%d", &c);

if (c <= d) //输入合法值
printf("%s\n", book[num[c - 1]]);

//while (getchar() != '\n');

}
return 0;

}

反思

巧妙使用strchr函数将单词的字母依次查找,通过修改为无关值排除了重复计算的可能,但是这样导致无法多次使用(字典单词都被修改为了无关项目),可以通过临时值存储字符,查询之后恢复原单词。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信