题目:给出一个数组,数组中每个元素是一个字符串,要求找出这些字符串最长的公共前缀
思路:这道题可以用字典树的数据结构解决,将每一个字符串按照前缀在内存中保存起来。
class Solution { private: struct Node { char symbol; vector<Node*> next; Node(char val): symbol(val){} }; public: string longestCommonPrefix(vector<string> &strs) { int len = strs.size(); int i,j,strLen,k,nodeSize; Node* root = new Node('+'); Node* findNode = root; bool flag; string LCP = ""; int min = 1000000; for(i=0; i<len; i++) { strLen = strs[i].length(); findNode = root; flag = true; min = (min < strLen ? min : strLen); for(j=0; j<strLen; j++) { nodeSize = findNode->next.size(); for(k=0; k<nodeSize && flag; k++) { if (strs[i][j] == findNode->next[k]->symbol) { break; } } if (k < nodeSize && flag) { findNode = findNode->next[k]; continue; } flag = false; Node* newNode = new Node(strs[i][j]); findNode->next.push_back(newNode); findNode = newNode; } } findNode = root; while(findNode->next.size() == 1 && LCP.length() < min) { LCP.push_back(findNode->next[0]->symbol); findNode = findNode->next[0]; } return LCP; } };
其实上面的代码还可以优化,既然是找出最长公共前缀,其实从第二个字符串开始,跟第一个字符串进行类比,一旦没找着同样的字符,就将其截断,不需要再将其保存在树中,代码如下:
class Solution { public: string longestCommonPrefix(vector<string> &strs) { int len = strs.size(); int i,j,strLen; bool flag; if (len == 0) { return ""; } string LCP = strs[0]; for(i=1; i<len; i++) { strLen = strs[i].length(); for(j=0; j<strLen; j++) { if (strs[i][j] != LCP[j]) { break; } } LCP = LCP.substr(0, j); } return LCP; } };