题目链接 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.youkuaiyun.com/u012717411/article/details/53433108
https://segmentfault.com/a/1190000019479965?utm_source=tag-newest

本文深入探讨了求解字符串数组中最长公共前缀的经典算法,通过字典树实现,并对比了字典序排序和逐字符对比两种高效解法。文章提供了详细的C++代码示例,适合算法初学者和进阶者学习。
400

被折叠的 条评论
为什么被折叠?



