C语言算法-解答最长公共前缀问题的C语言实现
题目
给定一个字符串数组 strs
,找到并返回这些字符串的最长公共前缀。如果不存在公共前缀,则返回空字符串。
引言
最长公共前缀问题要求在一组字符串中找到最长的共同前缀。解决这个问题需要考虑字符串之间的字符比较,并逐步缩小公共前缀的范围。
算法思路
我们将使用一种纵向扫描的方法来解决最长公共前缀问题。
算法的步骤如下:
- 如果字符串数组
strs
为空,直接返回空字符串。 - 初始化变量
prefix
为空字符串。 对字符串数组
strs
中的每个字符位置进行遍历:- 对于每个位置
i
,将第一个字符串strs[0]
的第i
个字符与其他字符串的第i
个字符进行比较。 - 如果比较过程中遇到不匹配或到达字符串结尾,则停止比较。
- 如果所有字符串的第
i
个字符匹配,则将该字符添加到prefix
中。
- 对于每个位置
- 返回
prefix
,即最长的公共前缀。
代码实现
下面是使用C语言实现的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize == 0) {
char* result = (char*)malloc(sizeof(char));
result[0] = '\0';
return result;
}
int prefixLength = strlen(strs[0]);
char* prefix = (char*)malloc(sizeof(char) * (prefixLength + 1));
strcpy(prefix, strs[0]);
for (int i = 1; i < strsSize; i++) {
int j = 0;
while (prefix[j] && strs[i][j] && prefix[j] == strs[i][j]) {
j++;
}
prefix[j] = '\0';
}
return prefix;
}
int main() {
char* strs[] = {"flower", "flow", "flight"};
int strsSize = sizeof(strs) / sizeof(strs[0]);
char* result = longestCommonPrefix(strs, strsSize);
printf("Longest Common Prefix: %s\n", result);
free(result);
return 0;
}
算法分析
该算法的时间复杂度为 O(m n),其中 m 是字符串数组中最长字符串的长度,n 是字符串数组的大小。在纵向比较的过程中,我们最多需要比较 m n 次字符。
空间复杂度为 O(m),其中 m 是字符串数组中最长字符串的长度。我们需要额外的空间来存储最长公共前缀。
示例和测试
示例输入1:
strs = ["flower", "flow", "flight"]
示例输出1:
Longest Common Prefix: "fl"
示例输入2:
strs = ["dog", "racecar", "car"]
示例输出2:
Longest Common Prefix: ""
总结
本文使用C语言实现了解答最长公共前缀问题的代码。通过纵向扫描字符串数组中的字符,我们能够找到最长的共同前缀。该算法的时间复杂度为 O(m * n),空间复杂度为 O(m)。