码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 14. Longest Common Prefix

时间:2018-12-03 15:38:36      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:==   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!