问题描述
给定四个字符串 a,b,c,d,请将这四个字符串按照任意顺序依次连接拼成一个字符串。
请问拼成的字符串字典序最小是多少?
输入格式
输入四行,每行包含一个字符串。
输出格式
输出一行包含一个字符串,表示答案。
样例输入
LAN
LAN
QIAO
BEI
样例输出
BEILANLANQIAO
评测用例规模与约定
对于所有评测用例,输入的字符串非空串,由大写字母组成,长度不超过 1000。
1. 字典序的基本概念
字典序是一种基于字母或字符顺序的排列方式,类似于字典中单词的排列顺序。
2. 字典序的比较规则
逐字符比较:从第一个字符开始,依次比较对应位置的字符。
ASCII码决定顺序:对于两个字符串,从左到右逐字符比较它们的ASCII码值,直到找到第一个不同的字符,此时ASCII码较小的字符所在的字符串字典序较小,如
'A'
(65) <'B'
(66))。长短规则:如果所有字符都相同,则较短的字符串字典序较小。
注意:
不能单纯的比较每个字符串字典序的大小然后拼接
比如 bba 和 bb bb<bba,而拼接后字典序bbabb < bbbba
所以正确的做法是枚举所有的拼接后的字典序,选出其中最小的
#include<iostream>
#include<string>
using namespace std;string s[4];
string ans;int main()
{for(int i=0; i<4; ++i) cin>>s[i];ans = s[0]+s[1]+s[2]+s[3]; //初始化为原始顺序的组合//遍历所有排列组合 i、j、a、b 分别代表4个字符串的下标。for(int i=0; i<4; ++i){for(int j=0; j<4; ++j){if(j==i) continue; //不能和第一个重复for(int a=0; a<4; ++a){if(a==j || a==i) continue; //不能和前两个重复 for(int b=0; b<4; ++b){if(b==a || b==i || b==j) continue; //不能和前三个重复string t = s[i]+s[j]+s[a]+s[b];//如果当前组合字典序更小,则更新ansif(t<ans) ans = t; }}}}cout<<ans;return 0;
}
string s[4]; //字符串数组
string s; //字符串变量,并且字符串变量可以通过下标访问单个字符