华为机试_HJ27 查找兄弟单词【中等】
目录
描述
输入描述:
输出描述:
解题过程
提交代码
学习代码
代码一
收藏点
描述
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词。
数据范围:1≤n≤1000 ,输入的字符串长度满足 1≤len(str)≤10 ,1≤k<n
输入描述:
输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k
输出描述:
第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。
解题过程
我的思路是,设置一个二维数组用来存放兄弟单词。
1. 判断是否为兄弟单词(根据单词的长度是否相等,以及是否是原来的单词)
2. 如果是兄弟单词,存进二维数组中;
3. 把二维数组每一个行进行字典序排序,使用strcmp函数;
4. 输出二维数组中第k个兄弟单词,即第k行
提交代码
学习代码
代码一
(来源:https://blog.nowcoder.net/n/97fe91225e2247b9bd49cf22058488cc)
我觉得他和我的思路是一样的
#include <string.h>
int main()
{
int x,i,j,k,n,num=1,cet=0,y,z;
scanf("%d",&x);
char str[x][12],word[12]={0},str1[x][12],temp[12];
memset(str, '\0', sizeof(str));
memset(str1, '\0', sizeof(str1));
for(i=0;i<x;i++)
{
scanf("%s",&str[i]);
}
scanf("%s",word);
scanf("%d",&z);
for(i=0;i<10;i++)
{
if(word[i]!='\0')
num*=word[i];
else
break;
}
for(j=0;j<x;j++)
{ y=1;
for(k=0;k<i;k++)
{
y*=str[j][k];
}
if(y==num&&str[j][i]=='\0')
{
strcpy(str1[cet++], str[j]);
}
}
y=cet;
for(j=0;j<y;j++)
{
if(strstr(str1[j],word)!=NULL)
{cet--;
str1[j][0]='~';
}
}
printf("%d\n",cet);
if(cet>=z)
{for(j=0;j<y;j++)
{
for(k=j;k<y;k++)
{
for(n=0;n<i;n++)
{
if(str1[j][n]<str1[k][n])
break;
if(str1[j][n]>str1[k][n])
{
strcpy(temp,str1[j]);
strcpy(str1[j],str1[k]);
strcpy(str1[k],temp);
break;
}
}
}
}
printf("%s\n",str1[z-1]);
}
}