我正在通过Facebook黑客杯解决以下问题:
由于您渴望采用最先进的技术,因此您刚刚购买了一款具有强大功能的手机:自动完成功能!您手机的自动填充版本有一些优缺点。一方面,它非常谨慎。只有当它确切知道你要写的内容时,它才会自动填充一个单词。另一方面,你必须教你想要使用的每个单词。
您有N个不同的字词,您希望按顺序发送短信。在发送每个单词之前,您可以将其添加到手机的词典中。然后,您编写手机所需的最小非空前缀,以自动填充该单词。此前缀必须是整个单词,或者前缀不是字典中任何其他单词的前缀。
发送所有N个字必须输入的最小字母数是多少?
我正在为此实现如下:
struct trie {
int ct;
vector<trie*> child;
trie() {
ct = 0;
for(int i = 0; i < 26; i++) {
child.push_back(nullptr);
}
}
~trie() {
//cerr << "called\n";
for(int i = 0; i < 26; i++) {
delete child[i];
}
child.clear();
}
};
void add(trie* t, const string &str, int i) {
//ct++;
int index = str[i] - 'a';
if(t->child[index] == nullptr) {
t->child[index] = new trie();
}
t->child[index]->ct++;
i++;
if(i != str.length()) {
add(t->child[index], str, i);
}
}
int getL(trie* t, const string &str, int i) {
if(i == str.length()) {
return i;
}
int index = str[i] - 'a';
if(t->child[index]->ct == 1) {
return i + 1;
}
else {
return getL(t->child[index], str, i + 1);
}
}
int solve() {
int n;
cin >> n;
string s;
//cin >> s;
int i;
trie* root = new trie();
int ans = 0;
for(i = 0; i < n; i++) {
cin >> s;
cerr << "READ " << s << '\n';
add(root, s, 0);
cerr << "DONE ADD\n";
ans += getL(root, s, 0);
}
//int ans = 0;
delete (root);
return ans;
}
但是我似乎遇到了分段错误(核心转储)错误,我理解这意味着我正在访问无效的内存位置但是我似乎无法弄清楚我的代码中的情况。任何帮助将不胜感激。