1. 题目描述
给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序。
比如:
举例:
-
strs=[“abc”,“de”]。可以拼成"abcde",也可以拼成"deabc",但前者字典顺序更小,所以返回“abcde”
-
strs=[“b”,“ba”]. 可以拼成“bba”和“bab”,后者字典序小,返回后者“bab”
2. 思路
我们可以借助C++ 中
sort
函数帮助我们排序。一种直观的思路就是我们可以对所有的字符串进行升序,然后在进行拼接,但是这种方法也会产生一个问题。比如’b’和’ba’进行排序,因为自然排序的情况下,‘b’ < ‘ba’那么拼接的结果就是’bba’。但是这不是我们想要的字典序,因为实际上’bab’< ‘bba’,因此这种先排序在拼接的思路是不对的。那么我们可以比较二种拼接的结果大小,然后做出正确的选择,比如’bab’ < ‘bba’,那么我们结果就是’bab’啦。刚好sort
函数可以提供自定义的比较器,也是比较方便的。
3. 代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
bool cmp(std::string& str1, std::string& str2) {
return str1 + str2 < str2 + str2 ? true : false;
}
std::string lowestString(std::vector<std::string>& str) {
if (str.size() == 0) return "";
int len = str.size();
std::string res = "";
std::sort(str.begin(), str.end(), cmp);
for (int i = 0; i < len; ++i) {
res += str[i];
}
return res;
}
int main() {
std::vector<std::string> str1 = {"b", "ba"};
std::vector<std::string> str2 = { "jibw", "ji", "jp", "bw", "jibw" };
std::string res1 = lowestString(str1);
std::string res2 = lowestString(str2);
std::cout << res1 << std::endl;
std::cout << res2 << std::endl;
return 0;