牛客-C语言解法-最长公共前缀

题目链接:

最长公共前缀_牛客题霸_牛客网 (nowcoder.com)

题目简介:

描述

给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。

数据范围: 0≤n≤5000, 0≤len(strsi​)≤5000

进阶:空间复杂度  O(1),时间复杂度  O(n∗len)

题目解法:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
 *BM84 最长公共前缀
描述
    给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 
    编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。

数据范围:  0≤n≤5000,  0≤len(strsi)≤5000
进阶:空间复杂度 O(1),时间复杂度 O(n*len)
*/

//获得第一个字符串的字符,然后逐个与其他字符串相同位置进行对比,如果不相等,则返回之前的公共前缀。
//如果相等,则进入下一个循环。
char* longestCommonPrefix(char** strs, int strsLen ) {
    // write code here
    int pre_i = 0, str_i = 0, len = 0;
    char * tmpstr = *strs;              //获得第一个字符串的指针,用于计算第一个字符串的长度来申请存储公共前缀的空间。
    while(tmpstr && *tmpstr != '\0'){   //最大公共前缀的长度是以最短的字符串来决定的,为了方便以第一个字符串的长度来申请
        len++;
        tmpstr++;
    }

    // char prefix[5]={0};              //测试代码
    char *prefix = (char*)malloc(sizeof(char)*(len+1));//以第一个字符串的长度+1来动态申请公共前缀的存储空间
    prefix[pre_i] = '\0';               //初始化公共前缀,默认为空
    if(strsLen == 0){                   //如果输入字符串数组为空,则返回空的公共前缀
        return prefix;
    }
    while(strs[0][str_i] != '\0' && strs[0][str_i] != NULL){      //如果第一个字符串的str_i位不为结尾,继续循环
        //将第一个字符串的str_i位存储到prefix中,后面用来与其他字符串的对应位进行比较
        prefix[str_i] =  strs[0][str_i];   
        for(int i=1; i<strsLen; i++){   //遍历第1个数组及以后剩余数组
            if(prefix[str_i]  != strs[i][str_i]){   //比较prefix与其他数组对应位是否一致
                prefix[str_i]='\0';     //如果不一致则表明prefix的str_i位不为公共部分,置空并返回
                return prefix;
            }
        }
        str_i++;                        //全部数组的str_i位均一致,移到str_i+1位进行下一次比较
    }
    prefix[str_i]='\0';                 //如果运行到这里,则表示第一个字符串str_i位为空,即第一个字符串到末尾了,需要末尾置空
    return prefix;                      
}
/**************************end******************************************/

int main ()
{
    char *s1[] = {"absc","abc","abca","abc","abcc"};//5
    char *s2[]={""};
    char *ret = longestCommonPrefix(s1, 5);
    printf("\r\nret:");
    printf("%s ", ret);
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值