对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。
给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串。
测试样例:
["abc","de"],2
"abcde"
分析:该题实际上是对数组中的字符串排序,不过要注意特殊情况,比如“b”和“ba“,按字典序是”bba“这样的顺序,但实际上应该是”bab“整个数组字典序才是最小的。所以比较方式要改为比较s1+s2>s2+s1。
代码如下:
class Prior {
public:
string findSmallest(vector<string> strs, int n) {
assert((int)strs.size() == n && n >= 0);
quick_sort_string(strs, 0, n-1);
string res;
for(int i=0; i<n; ++i)
res += strs[i];
return res;
}
private:
static bool compare(const string& s1, const string& s2){
return s1+s2 < s2+s1;
}
int random_range(const int begin, const int end){
return random()%(end - begin) + begin;
}
int partition(vector<string>& strs, int low, int high,
bool (*cmp)(const string&, const string&)){
int index = random_range(low, high);
std::swap(strs[index], strs[high]);
int small = -1;
for(index=0; index<high; ++index){
if(cmp(strs[index], strs[high])){ //注意strs[index]和strs[high]都是string类型
++small;
if(small != index)
std::swap(strs[small], strs[index]);
}
}
++small;
std::swap(strs[small], strs[high]);
return small;
}
void quick_sort_string(vector<string>& strs, int low, int high){
if(low < high){
int middle = partition(strs, low, high, compare);
quick_sort_string(strs, low, middle-1);
quick_sort_string(strs, middle+1, high);
}
}
};