题解 | 查找兄弟单词
查找兄弟单词
https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68
#include <stdio.h>
#include <string.h>
int bro(char s1[],char s2[]){
int len1=strlen(s1),len2=strlen(s2);
if((len1==len2)&&(strcmp(s1,s2)!=0)){
int a[len1],b[len1];
for(int i=0;i<len2;i++){
a[i]=0;
b[i]=0;
}
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
if(s1[i]==s2[j]&&a[i]==0&&b[j]==0){
a[i]=1;
b[j]=1;
}
}
}
int num=0;
for(int i=0;i<len1;i++){
if(a[i]==0||b[i]==0){
num++;
}
}
if(num==0){
return 1;
}
}
return 0;
}
int main() {
int n,k,num=0;
scanf("%d",&n);
char s[n][10],x[10];
for(int i=0;i<n;i++){
scanf("%s",s[i]);
}
scanf("%s %d",&x,&k);
int len=strlen(x);
for(int i=0;i<n;i++){
if(bro(s[i],x)){
num++;
}
}
printf("%d\n",num);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(strcmp(s[i],s[j])>0){
char temp[10];
strcpy(temp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],temp);
}
}
}
int kk=0;
for(int i=0;i<n;i++){
if(bro(s[i],x)){
kk++;
}
if(kk==k){
printf("%s\n",s[i]);
break;
}
}
return 0;
}
这道题的核心是查找 “兄弟字符串”,并按要求统计数量、输出排序后的第 k 个兄弟串:
1. 什么是兄弟字符串?
- 两个字符串长度必须相等
- 两个字符串内容不相同
- 两个字符串字符种类、个数完全一样(只是顺序不同,互为重排) 满足以上 3 点,就是兄弟字符串
2. 程序整体执行步骤
- 输入 n 个字符串,存入数组
- 输入目标串 x + 数字 k
- 遍历所有字符串,统计与 x 是兄弟串的总数量并输出
- 将所有字符串字典序从小到大排序
- 遍历排序后的数组,找到第 k 个兄弟串并输出
查看15道真题和解析