app 自己算不算一个词
同一个词库。运行下面这段程序:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#include <algorithm>
#include <map>
struct TNode {
map<char, TNode*> kids;
bool end = false; // 有没有一个词在这里结束
};
TNode* build_trie(const vector<string>& words) {
TNode* root = new TNode();
for (const string& w : words) {
TNode* node = root;
for (char ch : w) {
if (!node->kids.count(ch)) node->kids[ch] = new TNode();
node = node->kids[ch];
}
node->end = true;
}
return root;
}
TNode* walk(TNode* t, const string& pre) {
// 沿着前缀往下走,走不通返回 nullptr
TNode* node = t;
for (char ch : pre) {
if (!node->kids.count(ch)) return nullptr;
node = node->kids[ch];
}
return node;
}
void collect(TNode* node, const string& cur, vector<string>& out) {
// 把 node 下面所有的词收进 out
if (node->end) out.push_back(cur);
for (auto& kv : node->kids) collect(kv.second, cur + kv.first, out);
}
int main() {
TNode* t = build_trie({"apple", "app", "apply", "banana"});
cout << boolalpha << walk(t, "app")->end << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)