LeetCode 14. Longest Common Prefix

Posted 約束の空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 14. Longest Common Prefix相关的知识,希望对你有一定的参考价值。

方法一:

最容易想到的就是一个个比,如果不一样,那么前面的就是最长公共前缀。

为了防止下标越界等情况,先把最短的字符找出来,作为基准用来一位位比较。

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的主要内容,如果未能解决你的问题,请参考以下文章

leetcode14. longest common prefix

Leetcode 14. Longest Common Prefix

Leetcode 14 Longest Common Prefix

Leetcode14. Longest Common Prefix

LeetCode 14: Longest Common Prefix

leetcode 14. Longest Common Prefix