【C语言】题目分享:最长公共前缀

 题目

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

输入示例

输入: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));

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值