编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
方法一:
水平扫描法:
思路
首先,我们将描述一种查找一组字符串的最长公共前缀 LCP(S1…Sn) 的简单方法。
我们将会用到这样的结论:
LCP(S1…Sn)=LCP(LCP(LCP(S1,S2),S3),…Sn)
算法
为了运用这种思想,算法要依次遍历字符串 [S1…Sn] 当遍历到第 i个字符串的时候,找到最长公共前缀 LCP(S1…Si)。当 LCP(S1…Si)是一个空串的时候,算法就结束了。
否则,在执行了 n 次遍历之后,算法就会返回最终答案 LCP(S1…Sn)。
复杂度分析
时间复杂度:O(S),S 是所有字符串中字符数量的总和。
最坏的情况下,n个字符串都是相同的。算法会将 S1与其他字符串 [S2…Sn]都做一次比较。这样就会进行 S次字符比较,其中 S是输入数据中所有字符数量。
空间复杂度:O(1),我们只需要使用常数级别的额外空间。
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN(x, y) (x<y?x:y)
char * longestCommonPrefix(char **strs, int strsSize){
int ii=0;
static char *failed_string="";
if(strsSize== 0){
return failed_string;
}
for(;ii<strsSize;ii++){
if(strlen(strs[ii]) == 0)
return failed_string;
}
char *prefix=malloc(strlen(strs[0])+1);
memset(prefix, 0, strlen(strs[0])+1);
memcpy(prefix, strs[0], strlen(strs[0])); // 将传入字符串数组中第一个元素作为prefix
int jj=1; //接着开始循环遍历,从数组下标为1的位置开始于prefix逐个字符进行比较
for(;jj<strsSize; jj++){
int kk=0;
int str_len=strlen(strs[jj]); // 获取当前需要比较的字符串的长度
int prefix_len=strlen(prefix); // 获取当前prefix字符串的长度
int cmp_len=MIN(str_len, prefix_len); // 获取二者的最小值,用于比较字符
for(;kk<cmp_len;){ //
if(!memcmp(prefix, strs[jj], kk+1)){
kk++;
}else{
break;
}
}
if(kk==0){
if(prefix){
free(prefix);
prefix=NULL;
}
return failed_string;
}else{
memset(prefix, 0, strlen(prefix));
memcpy(prefix, strs[jj], kk);
}
}
return prefix;
}
所以整体算法的时间复杂度就是字符串数组中所有字符的个数。
作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
来源:https://www.cnblogs.com/pigdragon/p/12426700.html