C 语言中查找最长单词79


在 C 语言中查找字符串中最长单词是一个常见的编程任务。解决此问题的方法有多种,每种方法都有其优缺点。

朴素算法

最简单的算法是使用嵌套循环来遍历字符串中的每个字符。外层循环遍历字符串,而内层循环计算当前字符开始的单词长度。当内层循环达到一个空格或字符串末尾时,它将记录单词长度并比较它与迄今为止找到的 najdłuższy 单词。这种算法的时间复杂度为 O(n^2),其中 n 是字符串的长度。

KMP 算法

Knuth-Morris-Pratt (KMP) 算法是一种高效的字符串搜索算法,也可以用于查找最长单词。KMP 算法使用称为失败函数的预处理步骤来优化搜索过程。失败函数为字符串的每个字符存储一个值,指示当模式与字符串不匹配时应跳到字符串中的哪个字符。这种算法的时间复杂度为 O(n),其中 n 是字符串的长度。

后缀数组

后缀数组是一种数据结构,存储字符串的所有后缀的排序列表。使用后缀数组查找最长单词非常简单。只需找到后缀数组中 najdłuższy 后缀,它的长度就是字符串中最长单词的长度。构建后缀数组的时间复杂度为 O(n log n),其中 n 是字符串的长度。搜索后缀数组的时间复杂度为 O(log n)。

trie 树

trie 树是一种树形数据结构,用于存储字符串集合。trie 树可以用来查找字符串中最长单词,方法是遍历 trie 树并记录 najdłuższy 路径。trie 树的构建时间复杂度为 O(n),其中 n 是字符串集合中所有字符串的总长度。搜索 trie 树的时间复杂度为 O(m),其中 m 是 najdłuższy 单词的长度。

哪种算法是最好的?

哪种算法最适合查找字符串中最长单词取决于字符串的长度和单词分布。对于较短的字符串,朴素算法可能已经足够。对于较长的字符串,KMP 算法或后缀数组将是更好的选择。trie 树非常适合查找字符串集合中最长单词。

示例代码

以下是使用 KMP 算法在 C 语言中查找字符串中最长单词的示例代码:```c
#include
#include
#include
// 计算失败函数
int *failure_function(char *pattern) {
int m = strlen(pattern);
int *f = malloc(sizeof(int) * m);
f[0] = 0;
int i = 1;
int j = 0;
while (i < m) {
if (pattern[i] == pattern[j]) {
f[i] = j + 1;
i++;
j++;
} else if (j > 0) {
j = f[j - 1];
} else {
f[i] = 0;
i++;
}
}
return f;
}
// 查找 najdłuższy 单词
char *naj dłuższa_słowo(char *text) {
int n = strlen(text);
int *f = failure_function(text);
int i = 0;
int j = 0;
int naj długosc = 0;
char *naj dłuższa = NULL;
while (i < n) {
if (text[i] == ' ') {
if (j > naj dłuższość) {
naj długosc = j;
naj dłuższa = text + i - j;
}
j = 0;
} else if (j == 0) {
i++;
j++;
} else {
j = f[j - 1];
}
}
if (j > naj dłuższość) {
naj długosc = j;
naj dłuższa = text + i - j;
}
free(f);
return naj dłuższa;
}
int main() {
char text[] = "Ten tekst zawiera naj dłuższe słowo";
char *naj dłuższa = naj dłuższa_słowo(text);
printf("Naj dłuższe słowo to: %s", naj dłuższa);
return 0;
}
```
本代码将打印输出:"najdłuższe"。

2024-10-16


上一篇:C语言中double类型输出详解

下一篇:C 语言 exit() 函数