Я решаю задачу 336 в Leetcode, в то время как я нашел самый высокий ответ здесь использовал структуру Tr ie в java. Итак, я снова написал это на C ++. Я пытался оптимизировать, но время выполнения и память по-прежнему очень плохие. Изначально использовал shared_ptr, потом время выполнения: ~ 800 мс, память: 400Мб. Затем я использовал новый указатель, он стал ~ 300мс, 200Мб. Все еще намного медленнее, чем Java (20 мс, 50 МБ). Несколько раз пробовал, но все равно в 10 раз медленнее. Моя структура кода и logi c точно такие же, как и реализованный код java, но он такой медленный. Я не могу понять почему! вот мой код:
struct TrieNode {
TrieNode *next[26];
int index = -1;
vector<int> list;
TrieNode(){
memset(next,NULL,sizeof(next));
}
~TrieNode() {
for (int i = 0; i < 26; ++i) {
if (next[i]) delete(next[i]);
}
}
};
bool isPalindrome(const string &word, int start, int end) {
while (start < end) {
if (word[start] != word[end])
return false;
++start;
--end;
}
return true;
}
int addword(TrieNode* root, const string &word, int index) {
for (int i = word.size() - 1; i >= 0; --i) {
int j = word[i] - 'a';
if (!(root->next[j])) {
root->next[j] = new TrieNode;
}
if (isPalindrome(word, 0, i))
root->list.push_back(index);
root = root->next[j];
}
root->index = index;
root->list.push_back(index);
return 0;
}
void search(TrieNode* root, vector<string> &words, int index, vector<vector<int>> &res) {
for (int i = 0; i < words[index].size(); ++i) {
if (root->index >= 0 && root->index != index && isPalindrome(words[index], i, words[index].size() - 1)) {
res.push_back({index, root->index});
}
root = root->next[words[index][i] - 'a'];
if (!root) return;
}
for (int i : root->list) {
if (i == index) continue;
res.push_back({index, i});
}
}
vector<vector<int>> palindromePairs(vector<string>& words) {
vector<vector<int>> res;
TrieNode *root = new TrieNode;
for (int i = 0; i < words.size(); ++i) {
addword(root, words[i], i);
}
for (int i = 0; i < words.size(); ++i) {
search(root, words, i, res);
}
delete root;
return res;
}