HJ27. 查找兄弟单词
描述
输入描述
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k输出描述
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。示例1
输入:
3 abc bca cab abc 1
输出:
2 bca
示例2
输入:
6 cab ad abcd cba abc bca abc 1
输出:
3 bca
说明:
abc的兄弟单词有cab cba bca,所以输出3 经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bcaC 解法, 执行用时: 1ms, 内存消耗: 268KB, 提交时间: 2020-12-13
#include <stdio.h> #include <string.h> #include <stdlib.h> int comp(const void *a, const void *b){ return strcmp(*(char**)a, *(char**)b); } int main(void){ int len; int i, j; int n, k; char str[16]; int cnt[128] = { 0 }; while(scanf("%d", &n) == 1){ int top = -1; char *pwords[n]; char words[n][16]; for(i = 0; i < n; ++i) scanf("%s", words[i]); scanf("%s", str); scanf("%d", &k); len = strlen(str); for(i = 0; i < n; ++i){ if(len == strlen(words[i]) && strcmp(str, words[i])){ char *p = words[i]; for(j = 0; j < len; ++j){ ++cnt[str[j]]; --cnt[p[j]]; } int add = 1; for(j = 0; j < len; ++j){ if(cnt[str[j]] || cnt[p[j]]){ cnt[str[j]] = 0; cnt[p[j]] = 0; if(add == 1) add = 0; } } if(add) pwords[++top] = words[i]; } } qsort(pwords, top+1, sizeof(char*), comp); printf("%d\n", top+1); if(k-1 <= top) printf("%s\n", pwords[k-1]); } return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-12-28
#include <stdio.h> #include <stdlib.h> #include <string.h> void sortString(char str[], int length) { for (int i = 0; i < length - 1; i++) { for (int j = i + 1; j < length; j++) { if (str[i] > str[j]) { char temp = str[i]; str[i] = str[j]; str[j] = temp; } } } } int main() { int n; while (scanf("%d", &n) != EOF) { char dict[1000][50]; for (int i = 0; i < n; i++) { scanf("%s", &dict[i]); } char target[50]; scanf("%s", target); int targetIndex = 0; scanf("%d", &targetIndex); char res[1000][50]; int targetLen = strlen(target); int resIndex = 0; for (int i = 0; i < n; i++) { if ((strlen(dict[i]) == targetLen) && strcmp(dict[i], target) != 0) { char tempTarget[50]; char tempDict[50]; strcpy(tempTarget, target); strcpy(tempDict, dict[i]); sortString(tempTarget, strlen(tempTarget)); sortString(tempDict, strlen(tempDict)); if (strcmp(tempDict, tempTarget) == 0) { strcpy(res[resIndex++], dict[i]); } } } for (int i = 0; i < resIndex; i++) { for (int j = i + 1; j < resIndex; j++) { if (strcmp(res[i], res[j]) > 0) { char temp[50]; strcpy(temp, res[i]); strcpy(res[i], res[j]); strcpy(res[j], temp); } } } printf("%d\n", resIndex); if (resIndex >= 1 && targetIndex - 1 < resIndex) { printf("%s\n", res[targetIndex - 1]); } } return 0; }