题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
输入示例
输入:strs = ["flower","flow","flight"] 输出:"fl"
输入:strs = ["dog","racecar","car"] 输出:""
题解方法
由题目可以得知,当字符串不存在公共前缀,返回空字符串“ ”,显然当字符串为空即长度为0时,直接返回空字符串,对于普通字符串的比较,我们可以让比较前两个字符串,将相同的字符个数返回,然后用for循环将相同的字符拷贝到一个新的变量中,接着用这个拥有相同字符的变量与后面的字符串进行比较,直到没有相同字符返回k值,然后继续拷贝,得出最长公共前缀
需要注意的是,我们应该在开始的时候用动态内存创建一个变量,用来存储要比较的字符和公共前缀,同时,因为要涉及比较,strncpy函数不会拷贝\0,解引用时会造成溢出,所以要将拷贝后字符串末尾进行\0赋值
代码
int getCommonPrefix(char* prev, char* next) {
int len = strlen(prev) < strlen(next) ? strlen(prev) : strlen(next);
int k = 0;
while (k < len) {
if (prev[k] != next[k]) {
return k;
}
k++;
}
return k;
}
char* longestCommonPrefix(char** strs, int strsSize) {
if (strsSize <= 0) {
return "";
}
int commonPrefixLen = strlen(strs[0]);
char* commonPrefix = (char*)malloc((commonPrefixLen + 1) * sizeof(char));
strncpy(commonPrefix, *strs, commonPrefixLen);
// 给字符串结尾加上空字符,否则会数组访问出错,导致堆溢出
// 这个问题找了好久,最后发现strncpy只是复制字符,并不会自动在字符串结尾添加空字符
*(commonPrefix + commonPrefixLen) = '\0';
for (int i = 1; i < strsSize; i++)
{
int len = getCommonPrefix(commonPrefix, *(strs + i));
// 将字符串初始化为全空,此后复制字符不用担心结尾添加空字符的问题
memset(commonPrefix, '\0', commonPrefixLen + 1);
if (len <= 0) {
return commonPrefix;
}
strncpy(commonPrefix, *(strs + i), len);
}
return commonPrefix;
}
int main(void) {
char* strs[] = { "flower", "flow", "flight" };
printf("%s\n", longestCommonPrefix(strs, 3));
}