题目:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
c代码:
int commonPrefixLength(char* s1, char* s2) {
int i = 0;
while (s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i]) {
i++;
}
return i;
}
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize == 0) return "";
if (strsSize == 1) return strs[0];
// 取第一个字符串作为初始的公共前缀
char* prefix = strs[0];
int prefixLength = strlen(prefix);
for (int i = 1; i < strsSize; i++) {
// 计算当前字符串与公共前缀的公共前缀长度
int length = commonPrefixLength(prefix, strs[i]);
// 更新公共前缀长度
prefixLength = (length < prefixLength) ? length : prefixLength;
// 如果公共前缀长度为0,直接返回空字符串
if (prefixLength == 0) {
return "";
}
}
// 根据公共前缀长度创建结果字符串
char* result = (char*)malloc(prefixLength + 1);
strncpy(result, prefix, prefixLength);
result[prefixLength] = '\0'; // 确保字符串以空字符结尾
return result;
}
解析:
1.辅助函数 commonPrefixLength:
- 这个函数接受两个字符串 s1 和 s2 作为参数。
- 它通过一个循环来比较两个字符串从开始到它们不再相同的位置。
- i 是一个计数器,用来记录公共前缀的长度。
- 循环条件是 s1[i] 和 s2[i] 都不为字符串结束符 '\0' 且它们相等。
- 一旦 s1[i] 和 s2[i] 不再相等或任一字符串结束,循环结束,返回 i 作为公共前缀的长度。
2.主函数 longestCommonPrefix:
- 这个函数接受一个字符串数组 strs 和数组的大小 strsSize。
- 如果数组大小为0,即没有字符串,函数返回空字符串 ""。
- 如果数组大小为1,即只有一个字符串,直接返回这个字符串,因为它是唯一的公共前缀。
3.初始化公共前缀:
- 将数组中的第一个字符串作为初始的公共前缀 prefix。
- 计算这个字符串的长度 prefixLength。
4.循环遍历字符串数组:
- 从第二个字符串开始,使用 commonPrefixLength 函数计算它与当前公共前缀的公共前缀长度。
- 使用 length < prefixLength 来更新公共前缀的长度,取两者中的较小值。
- 如果在任何时候公共前缀的长度变为0,说明没有公共前缀,函数返回空字符串 ""。
5.创建结果字符串:
- 使用 malloc 分配足够的内存来存储最长公共前缀。
- 使用 strncpy 函数将公共前缀复制到新分配的内存中,直到 prefixLength 个字符。
- 确保新字符串以空字符 '\0' 结尾,这样它就是一个有效的C语言字符串。
6.返回结果:
- 返回包含最长公共前缀的新字符串。
7.内存管理:
- 由于使用了动态内存分配,调用者需要负责释放返回的字符串以避免内存泄漏。
笔记:
字符串数组:strs []= ["flower","flow","flight"], strs[0]是字符串"flower"中首元素的地址
二级指针:一个指针变量,它又存储了另一个指针变量的地址时,这就是一个二级指针。该案例中使用了一个二级指针 char** strs,用来索引字符串数组strs