zoukankan      html  css  js  c++  java
  • 最长公共前缀

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

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

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

  • 相关阅读:
    ssh无密码登录设置
    Spark Standalone Mode 多机启动 -- 分布式计算系统spark学习(二)(更新一键启动slavers)
    Spark Standalone Mode 单机启动Spark -- 分布式计算系统spark学习(一)
    为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息
    golang官方实现如何对httpserver做频率限制(最大连接数限制)
    【转】涨姿势了,数据库隔离性的几个级别
    loadRunner 11.0 安装及破解
    EF 如何code first
    百度搜索自动提示搜索相关内容----模拟实现
    如何写出专业级OOP程序-----文档注释
  • 原文地址:https://www.cnblogs.com/pigdragon/p/12426700.html
Copyright © 2011-2022 走看看