列表

详情


HJ27. 查找兄弟单词

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。

数据范围:,输入的字符串长度满足

输入描述

输入只有一行。 先输入字典中单词的个数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个字典序兄弟单词为bca

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 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;
}

上一题