题目大意:
给定字符串类型数组strs,找出一种拼接顺序来拼接str中的字符串,使得最终生成的大字符串字典序最小,并返回该大字符串。
如"ba”、“b”可以拼接为“bba”和“bab”,两者相比“bab”字典序更小,因此返回“bab”
题目思路:
这道题目实质上是一种排序问题。
以下是备选的几种方案:
1、给出所有可能的拼接方式,遍历求最小。太暴力了 ...不约不约,时间复杂度为O(N^2)
2、求出单个字符串的字典序,按照字典序从小到大的顺序排序
事实证明这个方案是错误的,如"ba" 和“b”按单个字符串的字典序排序结果为“bba”,并不是字典序最小的字符串
3、对于两个字符串str1、str2,如果str1+str2 < str2 + str1,str1就要放到str2的前面。
实现方案三:
class Prior {
public:
static bool cmp(string s1,string s2){
return (s1+s2<s2+s1);
}
string findSmallest(vector<string> strs, int n) {
sort(strs.begin(),strs.end(),cmp);
// write code here
string s;
for(int i = 0;i<n;i++){
s+=strs[i];
}
return s;
}
};
注意点:
1、排序使用c++ <vector>的sort函数;
2、自定义cmp比较函数,返回值为bool,类型为static。
为什么需要是static类型?
静态类型变量在类加载的同时会分配内存,而非static类型成员在对象生成时才会分配内存,静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。