[leetcode_14_longestCommonPrefix] 力扣第14题 最长公共前缀

题目描述

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

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

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成
我的题解
  • 思路

因为最长公共子串一定存在于最短的字符串中,由此即可确定循环边界。然后双重循环一个一个字符比较,内层循环每次正常结束再进行字符连接,否则跳出循环。

  • show me the code
int minStrLengthIndex(char **str, int strsSize){
	int minLength = strlen(str[0]);
	int index = 0;
	for(int i = 0;i < strsSize;i++){
		int size = strlen(str[i]);
		if(size <= minLength){
			minLength = size;
			index = i;	
		}
			
	}
	return index;
}


char * longestCommonPrefix_oom(char ** strs, int strsSize){
	
	if(strsSize == 0){
		return "";
	}
	
	if(strsSize == 1){
		return strs[0];
	}
	
	int minLengthIndex = minStrLengthIndex(strs, strsSize);
	int minLength = strlen(strs[minLengthIndex]);
	// printf("%d, %d", minLengthIndex, minLength);
    // 因为这里后续需要加上'\0'结束符所以要预留一个长度。
	char *res = (char *)malloc(sizeof(char)*(minLength + 1));
	int p = 0;
	for(int i = 0;i < minLength;i++){
		bool tag = true;
		for(int j = 0;j < strsSize - 1;j++){
			if(strs[j][i] == strs[j + 1][i]){
				// printf("%c,%c\n", strs[j][i], strs[j + 1][i]);
			}else{
				tag = false;
				break;
			}	
		}
		if(tag){
			res[p] = strs[strsSize - 1][i];
			p++;
			res[p] = '\0';
		}else{
			break;
		}

	}
	if(p == 0){
		return "";
	}
	return res; 
}
  • 提交结果

在这里插入图片描述

看到另外一种解法,其实求最小字符串是不必要的,因为在循环中两字符串在比对中遇到’\0’也是不相等的情况之一,所以不需要额外求最小串。由最后跳出循环的字符串索引,即可得到最长公共字符串。整体代码量少得多。

  • show me the code
char * longestCommonPrefix(char ** strs, int strsSize){
	
	int i = 0;
	bool flag = true;
	if(strsSize == 0){
		return "";
	}
	for(i = 0;flag && strs[0][i] != '\0';i++){
		for(int j = 1;j < strsSize;j++){
			if(strs[0][i] != strs[j][i]){
				flag = false;
				break;
			}
			
		}
		if(!flag){
			break;
		}	
	}
	
	char *res;
	res = (char *)malloc(sizeof(char)*(i+1));
	memcpy(res, strs[0], i);
	res[i] = '\0';
	return res;
	
}

原题链接:https://leetcode-cn.com/problems/longest-common-prefix

道友可以在博客下方留言互相探讨学习或者关注公众号fairy with you了解更多,欢迎来撩!

在这里插入图片描述

注:本博客仅用于交流学习,不用于任何商业用途,欢迎思维碰撞。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值