题意:
给一个单词字典A={str[0],str[1],...},再给定一系列的单词B={s[0],s[1],s[2],...},求字典A中以s[i]为前缀的单词有多少。
解法:
先建字典数,然后再查询每个给定的单词为前缀出现了多少次。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int sigma_size = 26;
char str[30];
struct Node {
int cnt;
Node *child[sigma_size];
Node() {
cnt = 0;
for(int i = 0; i < sigma_size; i++)
child[i] = NULL;
}
};
int idx(char ch) {
return ch - 'a';
}
void insert(Node* node, char s[]) {
int len = strlen(s);
for(int i = 0; i < len; i++) {
int id = idx(s[i]);
if(node->child[id] == NULL)
node->child[id] = new Node();
node = node->child[id];
(node->cnt)++;
}
}
int find(Node* node, char s[]) {
int len = strlen(s);
for(int i = 0; i < len; i++) {
int id = idx(s[i]);
if(node->child[id] == NULL)
return 0;
node = node->child[id];
}
return node->cnt;
}
int main() {
Node* root = new Node();
while(gets(str) && str[0] != '\0') {
insert(root, str);
}
while(gets(str)) {
printf("%d\n", find(root, str));
}
return 0;
}
本文介绍了一种使用字典构建和查询前缀的算法,详细阐述了其核心步骤和代码实现,包括插入操作和查找操作,旨在解决在给定单词集合中快速确定特定前缀单词数量的问题。
1010

被折叠的 条评论
为什么被折叠?



