最长公共前缀

落爺英雄遲暮 提交于 2020-03-31 02:52:50

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!