字典序字符串

题目地址:http://acm.fafu.edu.cn/problem.php?id=1003
数字接龙
Description:
不知大家是否玩过数字接龙的游戏,给你n个数字,将这n个数字连接在一起成一个数字,数字大者为胜。
我想会编程的你一定发现了,你每次都可以赢的,那么现在就来试试吧!
Input:
输入多组测试数据,每组数据第一行是一个正整数n(1≤n≤10)。接下来n行每行一串字符串,长度不大于10 。
Output:
每个测试数据输出一行,就是n串字符串连接成一串中字典序最大的那一串。
Sample Input:
2
123
456
3
ba
b
bab 
Sample Output:
456123
bbabba 

题意分析:如何能将n串字符串变成一串字典序最大的字符串。

这题不是平常做的那种字典序问题,需要一些小小的思考。这种问题我喜欢用sort函数来解决,因为sort函数只需要自己编写一个比较函数即可。下面来说思路。我们发现第一组测试数据123  456 的字符串长度相同,那么直接从头开始一个一个字符比较。我们来看第二组数据ba  b  bab这组数据的字符串长度都不相同。那么我们两两字符串进行比较把两个字符串连接起来,有两种情况,比如ba   b连起来后为bab和bba明显bba > bab,而原来他们的位置顺序为ba b,所以我们要做的就是把他们的顺序交换,变成b ba。其他以此类推。
核心代码为:
bool cmp(STR a,STR b)
{
    int lena = strlen(a.str);//a.str的长度
    int lenb = strlen(b.str);//b.str的长度
    if(lena == lenb)         //相等的情况
    {
        if(strcmp(a.str,b.str) > 0) return 1;//大于0说明a的字典序大于b,不了解strcmp函数的自行百度
        else return 0;
    }
    else
    {
        char temp[25];
        strcpy(temp,a.str); //这有点像交换两个数的值temp=a;a=b;b=temp;
        strcat(b.str,a.str);//这有点像交换两个数的值temp=a;a=b;b=temp;
        strcat(a.str,temp); //这有点像交换两个数的值temp=a;a=b;b=temp;
        if(strcmp(a.str,b.str) > 0) return 1;
        else return 0;
    }
}
完整的代码如下:
#include
#include
#include
using namespace std;
struct STR{
    char str[25];//数组大小要注意。题目要求1个字符串长度不大于10,但是我们后面用到strcat函数,所以至少要开两倍,即20,不然数组会越界
}s[25];
bool cmp(STR a,STR b)
{
    int lena = strlen(a.str);//a.str的长度
    int lenb = strlen(b.str);//b.str的长度
    if(lena == lenb)         //相等的情况
    {
        if(strcmp(a.str,b.str) > 0) return 1;//大于0说明a的字典序大于b,不了解strcmp函数的自行百度
        else return 0;
    }
    else
    {
        char temp[25];
        strcpy(temp,a.str); //这有点像交换两个数的值temp=a;a=b;b=temp;
        strcat(b.str,a.str);//这有点像交换两个数的值temp=a;a=b;b=temp;
        strcat(a.str,temp); //这有点像交换两个数的值temp=a;a=b;b=temp;
        if(strcmp(a.str,b.str) > 0) return 1;
        else return 0;
    }
}
int main(void)
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i = 0; i < n; i++)
            scanf("%s",&s[i].str);
        sort(s,s+n,cmp);
        for(int i = 0; i < n; i++)
            printf("%s%s",s[i].str,i==(n-1)?"\n":"");
    }

    return 0;
}







你可能感兴趣的:(字典序(字符串))