LeetCode 14. 最长公共前缀

题目链接 14. 最长公共前缀

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”

解释: 输入不存在公共前缀。

说明:
所有输入只包含小写字母 a-z 。

解题思路

一道经典的最长公共前缀,以前学过字典树,这次练习一个是回忆一下字典树的操作,还有一个是更加熟悉链表和一些定义类型。比如 struct trie trie* pnew root=new trie

程序代码

c++(非递归版,链表)

struct trie{
    trie  *next[26];
    int cnt;
}*root;
string ans;
int n;
void insert(string s) {
    trie *p=root;
    trie *pnew;int x;
    for(int i=0;i<s.size();++i) {
        x=s[i]-'a';
        if( p->next[x] == NULL ) {
            pnew = new trie;
            pnew->cnt=1;
            for(int j=0;j<26;++j) pnew->next[j]=NULL;
            p->next[x]=pnew;
        }
        else p->next[x]->cnt ++;
        p=p->next[x];
    } 
}
int search(string s) {
    trie *p=root;
    int x; int f=0;
    for(int i=0;i<s.size();++i) {
        x=s[i]-'a';
        if(p->next[x] == NULL) return 0;
        if(p->next[x]->cnt == n) {ans=s.substr(0,i+1);f=1;}
        p=p->next[x];
    }
    return f;
}
void init() {
    root = new trie;
    //trie *root;
    root->cnt=0;
    for(int i=0;i<26;++i) {
        root->next[i]=NULL;
    }
}
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        n=strs.size();
        if(!n) return ans="";
        init();
        for(int i=0;i<n;++i) {
            insert(strs[i]);
        }
        if(!search(strs[0])) return ans="";
        else return ans;
    }
};

另解

(参考的别人的解法)
第一种 将字符串数组里面按照字典序大小排序,然后比较第一个和最后一个字符串,用两个指针分别移动,知道他们不相同的时候返回当前的前缀。
第二种 将每个字符串依次和第一个字符串对比,指针i指向第一个字符串,指针j指向后面的所有字符串,一次比对,如果当前第i位所有的字符串中有一个不同,就直接返回当前前缀。
以前竞赛时没有碰到这么有趣的想法,一学到这就是用的字典树,思维没有打开。

参考博客
https://blog.csdn.net/u012717411/article/details/53433108

https://segmentfault.com/a/1190000019479965?utm_source=tag-newest

https://leetcode-cn.com/problems/longest-common-prefix/solution/ji-jian-6xing-c-ji-bai-bai-fen-zhi-944ms-z-by-zrit/

你可能感兴趣的:(LeetCode,链表,字符串)