問題描述
給定四個字符串 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;? //字符串變量,并且字符串變量可以通過下標訪問單個字符