This problem can be solved by vertical scanning: look at the first character of each string, then the second, and so on.
The following is the Trie approach: Note: isEnd is necessary because, for example, in the Trie for “flow” and “flower”, the children size of ‘w’ is also 1. If we don’t mark ‘flow’ as end, it will continue further.
classSolution { public: string longestCommonPrefix(vector<string> &strs) { if (strs.empty()) return""; Node *root = newNode();//A dummy node as root
// Insert all strings into the Trie for (const string &s : strs) { Node *p = root; for (char c : s) { if (!p->children.count(c)) { p->children[c] = newNode(); } p = p->children[c]; } p->isEnd = true; }
// Start from root and go down along the 'only branch' 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]; }