25、【字符串】最长公共前缀(C++版)

题目描述

在这里插入图片描述

题目分析

寻找最长公共前缀,便是寻找字符串数组中,所有字符串的公共值,而公共值由索引标号决定,因此目标就是找到字符串数组中对应的索引编号。

解法1:横向扫描

将字符串数组中的第一个字符串存入变量中,然后使用该变量与字符串数组中的第二个字符串进行比较,直到找到公共前缀和相对应的索引编号后,下次便使用公共前缀与下一个字符串再比较,因此类推最终找到最长公共前缀。
在这里插入图片描述

参考文章:最长公共前缀

代码实现

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
	if(strs.size() == 0)	return "";
	string a1 = strs[0];
	int i,j,index = strs[0].size();
	for(i = 1; i < strs.size(); i++){
		for(j = 0; a1[j] == strs[i][j] && j < index; j++);		//通过j < index来控制得到的为索引编号值最小
		index = j;		//注意:for循环先执行了j++,得到的判断不符条件才跳出循环,因此我们此时获取最长公共前缀的索引编号应该为index-1
	}
	return a1.substr(0,index);	//substr(0,index)会选择从索引标号0开始,往后index个长度的字符串,也就是最后获取的那个字符串的索引编号为index-1
    }
};

时间复杂度O(mn),空间复杂度为O(1)。
其中m是字符串中的字符串平均长度,n是字符串的数量。

解法2:纵向扫描

将字符串数组中的第一个字符串作为比较,先获取该字符串中的第一个字符,然后和其余几个字符串中的第一个字符进行比较,均相等后,比较第二个字符。若在其中出现不相等,则说明找到了最长公共前缀。
在这里插入图片描述

代码实现

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
	if(strs.size() == 0)	return "";
	char c;
	for(int i = 0; i < strs[0].size(); i++){
		c = strs[0][i];
		for(int j = 1; j < strs.size(); j++){
			if(i == strs[j].size() || c != strs[j][i])
				return strs[0].substr(0, i);
		}
	}
    return strs[0];
    }
};

时间复杂度O(mn),空间复杂度为O(1)。
其中m是字符串中的字符串平均长度,n是字符串的数量。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值