自动补全
Coddy 字典树:数据结构系列第 8 课 课程的第 12 课,共 14 课。
这是 trie 的经典用法:根据用户目前输入的内容,列出所有以该前缀开头的已存储单词。找到前缀对应的节点;如果找不到,就返回空结果。然后遍历该节点下方的子树,并收集找到的所有单词。
在 DFS 向下遍历时,沿途逐步构建单词,每次都追加刚经过的边所对应的字符。每当到达一个 isEndOfWord 的值为 true 的节点时,当前路径就是一个匹配项。
挑战
中等编写一个函数 autocomplete,它接收一个字符串数组 words 和一个字符串 prefix,并返回数组中所有以 prefix 开头的单词组成的列表。
返回的列表必须按升序(字母顺序)排列。如果没有匹配的单词,则返回空列表。
你必须使用 Trie 类(由 trie 和 trienode 提供),不要使用语言内置的集合、字典或映射来计数或跟踪数据。
亲手试试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "solution.h"
int main() {
char l1[4096], prefix[1024];
if (!fgets(l1, sizeof(l1), stdin)) l1[0] = 0;
if (!fgets(prefix, sizeof(prefix), stdin)) prefix[0] = 0;
l1[strcspn(l1, "\r\n")] = '\0';
prefix[strcspn(prefix, "\r\n")] = '\0';
char* words[1024]; int n = 0;
char* tok = strtok(l1, " \t");
while (tok && n < 1024) { words[n++] = tok; tok = strtok(NULL, " \t"); }
int out_n = 0;
char** res = autocomplete(words, n, prefix, &out_n);
for (int i = 0; i < out_n; i++) { printf("%s", res[i]); if (i + 1 < out_n) printf(" "); }
printf("\n");
if (res) free(res);
return 0;
}
字典树:数据结构系列第 8 课中的所有课
自己练习: C 在线编译器