sicily--1198. Substring

1.一开始觉得就将字符串排好序,将排在前的字符串放在“终”字符串的前列,直至拼接完所有的字符串; 但是没想到一直 WA,上网查了一下,发现了这个大大的问题:

//c和ca,是cac而不是cca;
//ae和aec, 是aeaec 而不是 aecae
2.分析一下:

string1 = "cccca";
string2 = "ccccb";
        这两个字符串的比较需要比较到最后一个字符,为什么呢,因为前面的字符必然是完全相同的才会有比较下一位的需求,这样子string1在string2前面才会拼出一个最小的字符串,这是在两个字符串一样长度的时候;

string1 = "c**c";//m位
string2 = "c**ca";//n位,假如 n > m
        上面两个字符串的长度不一样,如果单单是比较两个字符串的大小的话,明显string1比较小,按照我一开始的想法拼接结果就是string1在string2前面,这样的结果我们明显知道是错的;

        比较两个字符串时,因为前面的 m 位都是一样的,所以当按照我的“旧想法”的话,“最终字符串”的第 m + 1位就是字符串string2(较长的字符串)的第一位,但是如果string2的第m + 1位比 string2的第一位还要小呢?也就是说如果用string2作为最终字符串的前头时,前面的m 位均于上一种情况一样,但是在第m + 1位上却比上一种的小,显然这才是我们相要的;

        所以,按照上面的分析,我们知道,面对两个不同长度的字符串时,我们可以将字符串补满(99位),而补充的字符就是每个字符串的第一个字符,这样,我们再来比较字符串的话就能按照我的“旧想法”来拼接字符串了


#include<iostream>
#include<string>
using namespace std;

int main()
{
    int testnum;     //测试次数
    cin >> testnum;
    for(int i = 0; i < testnum ; i++)
    {
        string str[8] = {};
        int size[8] = {0};
        int num;   //字符串的数目
        cin >> num;
        for(int j = 0 ; j < num ; j++)
        {
            cin >> str[j];    //输入字符串
             size[j] = str[j].size();    //获取每个字符串的长度
            
             if(size[j] < 100)    //将字符串补足99位,因题目说字符串长度少于100
            {
                for(int p = size[j] ; p < 100 ; p++)    //以字符串的第一位补齐至99位
                    str[j] = str[j] + str[j][0];
            }
        }
        
        for(int k=0;k<num;k++)         //将补齐后的字符串排序,按字典序排列
        {
            for(int l=k;l<num;l++)
            {
                string temp1;
                int temp2;
                if(str[l]<str[k])
                {
                    temp1=str[l];
                    str[l]=str[k];
                    str[k]=temp1;
                    temp2=size[l];
                    size[l]=size[k];
                    size[k]=temp2;
                }
            }
        }
        
        string s;   //用于储存拼接后的字符串
        for(int m=0;m<num;m++)
            for(int n=0;n<size[m];n++)
               s=s+str[m][n];   //从前到后的拼接
        cout<<s<<endl;
    }
    return 0;
}                                 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值