思路有误的地方或者想复杂了的地方欢迎指出,俺滴水平有限,难免遗漏。
喷子请绕路,谢谢。
小Q在做一个给人取名字的程序,有n个名字,每个名字是一个字符串,陆续有m个人找你取名字,每个人有一个要求,(str1,str2),他的名字要以str1为前缀,不能以str2为前缀,你要在所有满足条件的名字里选出字典序最小的给他,没有就输出-1;
思路:
得到所有名字,对名字进行排序。
得到str1的长度,调用函数strncmp(str1,names[j],str1_len)
直接比较前n个字符前缀是否相同,如果相同,就倒着比较后缀。
如果后缀完全一样,不满足条件,查看下一个,如果都不满足,输出-1,
后缀有不一样的,输出该字符串。
这里注意,按照字典序排序这里题目给的字典序和网上普遍定义的字典序不一样,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
5 4
aaab
aab
aa
aabb
a
a c
aa aab
aaa aaab
a aaa
**/
void sort(char title[][100],int n) {//排序
int i,j,k;
char tstr[100];
for(i = 0; i < n - 1; ++i) {
k = i;
for(j = i + 1; j < n; ++j) {
if(strcmp(title[k],title[j]) > 0)
k = j;
}
if(k != i) {
strcpy(tstr,title[k]);
strcpy(title[k],title[i]);
strcpy(title[i],tstr);
}
}
}
void show(char s[][100],int n) {
int i;
for(i = 0; i < n; ++i)
printf("*%s\n",s[i]);
puts(" ");
}
int main()
{
int n,m;
char names[100][100];
scanf("%d %d",&n,&m);
int i=0;
for(i=0; i<n; i++)
{
scanf("%s",names[i]);
}
show(names,n);
sort(names,n);
show(names,n);
for(i=0; i<m; i++)
{
char str1[100];
char str2[100];
char str3[100];
scanf("%s %s",str1,str2);
int str1_len=strlen(str1);
int str2_len=strlen(str2);
int j=0;
int flag=1;
for(j=0; j<n; j++)
{
if(strncmp(str1,names[j],str1_len)==0)
{
//前缀相同
int len=strlen(names[j]);
int k=0;
flag=1;
for(k=len; k>=len-str2_len; k--)
{
if(str2[k]!=names[j][k])
{
flag=0;
printf("不符合%c,%c\n",str2[k],names[j][k]);
break;
}
}
if(flag==0)
{
printf("%s\n",names[j]);
names[j][0]='\0';
break;
}
}
}
if(flag==1)
{
printf("-1\n");
}
}
return 0;
}