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;
}