【死磕算法·字符串问题】字符串拼接最小字典序问题

题目大意:

给定字符串类型数组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类型成员在对象生成时才会分配内存,静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。

详见C++静态成员函数小结(转)

猜你喜欢

转载自blog.csdn.net/gulaixiangjuejue/article/details/85011707