时间轴

2025-11-09

init


题目:


这题可以直接纵向查找,看每个string的第一个字母,然后看第二个,以此类推,但下面写法是字典树的写法:
注意:isEnd是必需的,因为例如”flow”, “flower”这个字典树,w的children的size也为1,如果没有表示flow为end那么会继续往下走。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <vector>
#include <unordered_map>

using std::string;
using std::vector;
using std::unordered_map;

struct Node {
unordered_map<char, Node *> children;
bool isEnd = false;
};

class Solution {
public:
string longestCommonPrefix(vector<string> &strs)
{
if (strs.empty())
return "";
Node *root = new Node();//一个虚拟节点作为根节点

//插入所有字符串到 Trie
for (const string &s : strs) {
Node *p = root;
for (char c : s) {
if (!p->children.count(c)) {
p->children[c] = new Node();
}
p = p->children[c];
}
p->isEnd = true;
}

//从 root 出发,沿着“唯一分支”走下去
string prefix;
Node *p = root;
while (p && p->children.size() == 1 && !p->isEnd) {
char next = p->children.begin()->first;
prefix.push_back(next);
p = p->children[next];
}

return prefix;
}
};