题目:
这题可以直接纵向查找,看每个 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();
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; }
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; } };
|