描述:
给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。
数据范围: 0≤n≤5000, 0≤len(strsi)≤5000
进阶:空间复杂度O(1),时间复杂度O(n∗len)
示例1:
输入:["abca","abc","abca","abc","abcc"]
返回值:"abc"
示例2:
输入:["abc"]
返回值:"abc"
解题思路:
首先是需要审题:
1. n 为字符串,n 可能为0,最大为5000
2. 字符串的长度len,len可能为0,最大为5000
3. 求最长的公共前缀,因为是公共前缀,所以,需要该前缀是每个字符串从第一个字符开始的所有字符都相同。
4. 时间复杂度为 O(n * len),即n 个字符串都轮询,字符串的每个字符都轮询,两重循环
代码:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param strs string字符串一维数组
* @param strsLen int strs数组长度
* @return string字符串
*/
char* longestCommonPrefix(char** strs, int n ) {
if (strs == NULL || n <= 0) {
return "";
}
char* prefix = strs[0];
char* nextStr = NULL;
char* p = NULL;
for (int i = 1; i < n; ++i) {
p = prefix;
nextStr = strs[i];
while (*p != 0 && *nextStr != 0) {
if (*p != *nextStr) {
*p = 0;
break;
}
p++;
nextStr++;
}
*p = 0;
}
return prefix;
}
将第一个 字符串 作为参考,之后的每个字符串每个字符都逐一比较,如果出现字符不相等,则退出循环。
这里 prefix 这个字符串将作为返回的字符串,所以,原字符串可能被修改,但根据传入的参数非const,表示该入参是可以修改的。所以,当每次比较到不相等字符时,该 prefix 的最后一个比较字符会被置为 0,即被置上字符串的结束符,方便prefix的直接返回。