如何将一个字符串字典序排列,用c++写
时间: 2024-10-25 14:15:37 浏览: 8
在C++中,你可以使用标准库中的`std::sort`函数配合自定义比较函数来实现字符串的字典序排列。这里是一个简单的例子:
```cpp
#include <algorithm>
#include <string>
// 自定义比较函数,用于按字典序排列
bool compareStrings(const std::string& a, const std::string& b) {
return a < b; // 使用默认的字典序比较,即ASCII码从小到大
}
int main() {
std::vector<std::string> stringVec = {"banana", "apple", "cherry", "date"};
// 对字符串向量进行字典序排序
std::sort(stringVec.begin(), stringVec.end(), compareStrings);
for (const auto& str : stringVec) {
std::cout << str << " ";
}
return 0;
}
```
在这个例子中,`compareStrings`函数返回true当第一个字符串应排在第二个字符串前面,反之则返回false。`std::sort`函数会遍历整个向量并根据这个比较函数对元素进行排序。
相关问题
如何输入一个字符串并将其字典序排列,用c++写
在C++中,你可以使用`std::sort()`函数结合字符数组或`std::string`来对字符串进行字典序排序。这里是一个简单的例子,我们将使用`std::sort()`函数配合`char*`指针来完成这个任务:
```cpp
#include <algorithm>
#include <iostream>
bool compare_chars(char a, char b) {
return a < b;
}
void sort_string(char* str) {
std::sort(str, str + strlen(str), compare_chars);
}
int main() {
char str[] = "hello world";
std::cout << "Original string: " << str << std::endl;
// 排序字符串
sort_string(str);
std::cout << "Sorted string: " << str << std::endl;
return 0;
}
```
在这个示例中,`compare_chars`函数作为比较器告诉`std::sort()`如何判断字符的顺序。然后,`sort_string`函数接受字符串的首地址,并将整个字符串传递给`sort()`。
给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。C++实现
可以使用后缀数组来解决这个问题。先构建字符串 s 的后缀数组 sa,并预处理出它的 height 数组。height[i] 表示排名为 i 的后缀与排名为 i-1 的后缀的最长公共前缀。
然后从后往前遍历 height 数组,找到第一个 height[i] 小于 height[i+1] 的位置 i。其实就是找到了子串 s[sa[i]...sa[i]+height[i]] 的结尾在所有子串中排在最后的那个。
C++代码如下:
int sa[N], rk[N], height[N];
int tmp1[N], tmp2[N], c[N];
void build_sa(char *s, int n) {
int m = 256;
for (int i = 0; i < n; ++i) ++c[rk[i] = s[i]];
for (int i = 1; i < m; ++i) c[i] += c[i-1];
for (int i = n-1; i >= 0; --i) sa[--c[s[i]]] = i;
for (int k = 1; k <= n; k <<= 1) {
int num = 0;
for (int i = n-k; i < n; ++i) tmp2[num++] = i;
for (int i = 0; i < n; ++i) if (sa[i] >= k) tmp2[num++] = sa[i]-k;
for (int i = 0; i < m; ++i) c[i] = 0;
for (int i = 0; i < n; ++i) ++c[tmp1[i] = rk[i]];
for (int i = 1; i < m; ++i) c[i] += c[i-1];
for (int i = n-1; i >= 0; --i) sa[--c[tmp1[tmp2[i]]]] = tmp2[i];
swap(rk, tmp1);
rk[sa[0]] = 0; num = 1;
for (int i = 1; i < n; ++i) {
if (tmp1[sa[i]] == tmp1[sa[i-1]] && tmp1[sa[i]+k] == tmp1[sa[i-1]+k])
rk[sa[i]] = num-1;
else
rk[sa[i]] = num++;
}
if (num >= n) break;
m = num;
}
}
void build_height(char *s, int n) {
for (int i = 0; i < n; ++i) rk[sa[i]] = i;
int k = 0;
for (int i = 0; i < n; ++i) {
if (rk[i] == 0) continue;
if (k) --k;
int j = sa[rk[i]-1];
while (s[i+k] == s[j+k]) ++k;
height[rk[i]] = k;
}
}
char s[N];
int main() {
scanf("%s", s);
int n = strlen(s);
build_sa(s, n+1);
build_height(s, n);
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (height[i] < height[i+1]) ans = i;
}
printf("%s\n", s+sa[ans]);
return 0;
}
阅读全文