2019腾讯第三次笔试 小Q取名字

思路有误的地方或者想复杂了的地方欢迎指出,俺滴水平有限,难免遗漏。
喷子请绕路,谢谢。

小Q在做一个给人取名字的程序,有n个名字,每个名字是一个字符串,陆续有m个人找你取名字,每个人有一个要求,(str1,str2),他的名字要以str1为前缀,不能以str2为前缀,你要在所有满足条件的名字里选出字典序最小的给他,没有就输出-1;
2019腾讯第三次笔试 小Q取名字_第1张图片
2019腾讯第三次笔试 小Q取名字_第2张图片
2019腾讯第三次笔试 小Q取名字_第3张图片

思路:

得到所有名字,对名字进行排序。
得到str1的长度,调用函数strncmp(str1,names[j],str1_len)直接比较前n个字符前缀是否相同,如果相同,就倒着比较后缀。
如果后缀完全一样,不满足条件,查看下一个,如果都不满足,输出-1,
后缀有不一样的,输出该字符串。
这里注意,按照字典序排序这里题目给的字典序和网上普遍定义的字典序不一样,

#include 
#include 
#include 

/**
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=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;
}

你可能感兴趣的:(c,被虐菜的经历,算法)