标签:== longest Fix arc mon str 结果 .com 情况
方法一:
最容易想到的就是一个个比,如果不一样,那么前面的就是最长公共前缀。
为了防止下标越界等情况,先把最短的字符找出来,作为基准用来一位位比较。
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if (strs.size()==0) return ""; string min_str=strs[0]; for (string str:strs){ if (str.size()<min_str.size()) min_str=str; } int i; for (i=0;i<min_str.size();++i){ for (string str:strs){ if (str[i]!=min_str[i]){ return min_str.substr(0,i); } } } return min_str; } };
方法二:Trie
虽然在这道题里trie的优势没有体现出来,但还是写了一下,就当复习Trie。
找最长公共前缀也很容易,只要找到 next数组里有超过一个元素的节点即可。但是要注意,如果某个节点isend==true,说明某个字符串结束了,直接返回结果即可,不能再继续往下找了。
struct TrieNode{ bool isend; vector<TrieNode *> next; TrieNode():isend(false),next(26,NULL){} }; class Trie{ private: TrieNode *root; public: Trie(){ root = new TrieNode(); } void insert(string word){ if (search(word)) return; TrieNode *p=root; for (char ch:word){ if (p->next[ch-‘a‘]==NULL) p->next[ch-‘a‘] = new TrieNode(); p = p->next[ch-‘a‘]; } p->isend = true; } bool search(string word){ TrieNode *p=root; for (char ch:word){ p = p->next[ch-‘a‘]; if (p==NULL) return false; } return p->isend==true; } // find the longest common prefix in the Trie string commonPrefix(){ TrieNode *p=root; string res=""; while (true){ int count=0; int next_char; if (p->isend==true) return res; for (char ch=‘a‘;ch<=‘z‘;++ch){ if (p->next[ch-‘a‘]!=NULL){ next_char = ch; ++count; } } if (count>1) return res; if (count==1){ p=p->next[next_char-‘a‘]; res += next_char; } } } }; class Solution { public: string longestCommonPrefix(vector<string>& strs) { if (strs.size()==0) return ""; Trie trie; for (string str:strs){ trie.insert(str); } return trie.commonPrefix(); } };
LeetCode 14. Longest Common Prefix
标签:== longest Fix arc mon str 结果 .com 情况
原文地址:https://www.cnblogs.com/hankunyan/p/10058096.html