题目来源
知识点:贪心算法
问题描述
给定一些字符串(只包含小写字母),要求将他们串起来构成一个字典序最小的字符串。
输入格式
第一行 T,表示有T组数据。
接下来 T 组数据
每组第一行一个正整数n,表示字符串个数。
接下来n行,每行一个字符串(长度不超过100)。
输出格式
T行,每行一个字符串。
样例输入
1
3
a
b
c
样例输出
abc
数据规模和约定
T<=7000,n<=100;
题目分析
一开始我的做法为:对一组中的所有字符串按照从小到大排序,依次输出。提交代码发现答案错误。通过查看输入样例,发现仅仅对单个字符串进行比较排序是不对的。
要想组合出来的字符串最小,就要找到两个字符串以不同方式组合时,最小的那种组合。所以排序的依据不是单个字符串的大小,而是组合字符串的大小。
代码
#include <bits/stdc++.h>
using namespace std;
bool cmp(string s1, string s2) {
string s3 = s1 + s2;
string s4 = s2 + s1;
if(s3.compare(s4) < 0) return true;
else return false;
}
int main() {
int t;
cin >> t;
string str[120];
while(t--) {
int n;
cin >> n;
for(int i=0; i<n; i++) {
cin >> str[i];
}
sort(str, str + n, cmp);
for(int i=0; i<n; i++) {
cout << str[i];
}
cout << endl;
}
return 0;
}