• 最长公共前缀


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

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

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

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12426700.html
Copyright © 2020-2023  润新知