字符串算法

获取字典序最小字符串

网易笔试题

题目:

一个数组有字符串["avb","sda","sadasdsa","sadasd"],将数组中所有的字符串合在一起,形成字典序最小。

解:

可以使用贪心算法来求解这个问题。贪心的思想是:对于两个字符串 s1 和 s2,如果 s1+s2 的字典序比 s2+s1 小,则应该先将 s1 接在 s2 的后面。

具体的做法是将字符串数组按照字典序从小到大排序,然后将排好序的字符串依次拼接起来,最终形成的字符串就是字典序最小的字符串。

以下是 C++ 代码实现:

```c++
#include 
#include 
#include 
#include 
using namespace std;

bool compare(string &s1, string &s2) {
  return s1 + s2 < s2 + s1;
}

string getMinString(vector strs) {
  sort(strs.begin(), strs.end(), compare);
  string res;
  for (auto& s : strs) {
    res += s;
  }
  return res;
}

int main() {
  vector strs {"avb", "sda", "sadasdsa", "sadasd"};
  string res = getMinString(strs);
  cout << res << endl;  // "avbsadasdsadasdsda"
  return 0;
}
```

首先定义一个比较函数 compare,比较两个字符串 s1 和 s2,如果 s1+s2 的字典序比 s2+s1 小,则返回 true,否则返回 false。

然后将字符串数组按照 compare 函数的比较结果从小到大排序,最后将排好序的字符串依次拼接起来,得到的字符串就是字典序最小的。

sort中compare的原理

sort 函数的第三个参数是一个比较函数,它用于指定元素之间的排序顺序。该函数必须接受两个参数,通常为引用类型的 const T&,例如:

```c++
bool compare(const int& a, const int& b) {
  return a > b;
}
```

其中第一个参数 a 表示待比较的元素,第二个参数 b 表示被比较的元素。比较函数需要返回一个 bool 值,用于指示待比较元素是否大于被比较元素(如果返回 true,则被比较元素排在前面;反之,如果返回 false,则被比较元素排在后面)。默认使用升序排序规则。

当使用 sort 函数进行排序时,sort 函数会自动调用指定的比较函数,将传入的元素依次与其他元素进行比较排序,直到所有元素都被排好序。比如:

```c++
sort(arr, arr + n, greaterThan);
```

表示对数组 arr 进行排序,并按照 greaterThan 函数所定义的排序规则进行排序。

需要注意的是,如果指定的比较函数返回 true 和 false 的条件不是相反的,将会导致排序结果不正确。因此,比较函数的实现必须确保返回 true 和 false 的条件是互斥的,即:

1. 如果 a > b,则返回 true。
2. 如果 a <= b,则返回 false。

否则排序结果将是不正确的。

你可能感兴趣的:(算法)