题目描述:查找兄弟单词_牛客题霸_牛客网
这道题挺有意思,下面讲讲我的解题思路。
首先用二维字符数组str将待查找的字符串序列一行一行的逐次存储,
用一维字符数组son存储子串。
题目重点和难点在于兄弟单词的查找匹配,如果是兄弟单词,那么str[i]和son肯定不相等,这个可以调用库函数strcmp进行判断,并且兄弟单词的长度肯定是相等的。
外层循环遍历二维数组str的每一行,用temp存储str[i],内循环对temp进行判定是否为兄弟单词,首先要满足和子串不相同,且长度相等,这是兄弟单词最基本的要求,然后用ch存放子串son的每一个字符,对temp进行遍历查找,如果找到,就将该位置的字符改成1,因为字符也是整形数据,以ASCII码存储,简单的说就是,将每个字符进行对比,匹配成功就置一。当一个子串匹配完后,将temp数组值加起来赋给sum,如果sum等于串的长度,那么肯定匹配成功了,之后str[i]存入二维数组match
最后对二维match数组内字符串进行升序,用strcmp比较即可。
以下为代码实现:
#include <stdio.h>
#include <string.h>
#define N 1000
#define M 10
int main()
{
char str[N][M],son[M],temp[M],match[N][M],ch;
int n,k,i,j,len,m,flag,sum,cnt=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
}
scanf("%s%d",son,&k);
len=strlen(son);
for(i=0;i<n;i++)
{
strcpy(temp,str[i]);
if(strcmp(temp,son)!=0&&len==strlen(temp))
{
sum=0;
for(j=0;j<len;j++)
{
m=0;flag=0;
ch=son[j];
while(temp[m]!='\0'&&flag==0)
{
if(temp[m]==ch)
{
flag=1;
temp[m]=1;
}
m++;
}
}
for(j=0;j<len;j++)
{
sum+=temp[j];
}
if(sum==len)
{
strcpy(match[cnt++],str[i]);
}
}
}
for(i=0;i<cnt-1;i++)
{
for(j=0;j<cnt-1-i;j++)
{
if(strcmp(match[j],match[j+1])>0)
{
strcpy(temp,match[j]);
strcpy(match[j],match[j+1]);
strcpy(match[j+1],temp);
}
}
}
printf("%d\n",cnt);
if(k<=cnt)
{
printf("%s\n",match[k-1]);
}
return 0;
}