题解 | #最长公共前缀#
最长公共前缀
https://www.nowcoder.com/practice/28eb3175488f4434a4a6207f6f484f47
C语言
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;
}