赞
踩
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0){ return ""; } if(strs.size()==1){ return strs[0]; } sort(strs.begin(),strs.end()); string &s1 = strs[0]; string &s2 =strs[strs.size()-1]; int i; for(i=0;i<min(s1.size(),s2.size());i++){ if(s1[i]!=s2[i]){ break; } } return s1.substr(0,i); } };
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string res = strs.empty() ? "" : strs[0];
for (string s : strs)
while (s.find(res) != 0) res = res.substr(0, res.length() - 1);
return res;
}
};
最简单的暴力法。
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0){ return ""; } int len = INT_MAX; for(string &s:strs){ len = min(len,(int)s.size()); } string res = strs[0]; int i; for(i=1;i<=len;i++){ for(string &s:strs){ if(s.find(res.substr(0,i))!=0){ return res.substr(0,i-1); } } } return res.substr(0,len); } };
tot
变量加1,这个字符串对应的每个节点值也加1。tot
,那么这个深度就是最长前缀的长度。class Trie{ struct Node{ int cnt = 0; Node* childs[26] = {0}; }; Node *root; int tot = 0,depth = 0; public: Trie(){ root = new Node; } void insert(string s){ tot++; Node *p = root; p->cnt++; for(char c:s){ if(p->childs[c-'a'] ==nullptr){ p->childs[c-'a'] = new Node; } p = p->childs[c-'a']; p->cnt++; } } int askLargestPrefix(){ dfs(root,0); return depth; } void dfs(Node *root,int dpt){ if(!root || root->cnt<tot){ return; } depth = max(depth,dpt); for(int i=0;i<26;i++){ dfs(root->childs[i],dpt+1); } } }; class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0){ return ""; } Trie trie; for(string &s:strs){ trie.insert(s); } int len = trie.askLargestPrefix(); return strs[0].substr(0,len); } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。