题目链接:
最长公共前缀_牛客题霸_牛客网 (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;
}