LeetCode刷题(5)--最长公共前缀详解

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

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

解题思路

方法一
将字符串数组首元素的每一个字符和其它元素的每一个字符比较,若出现不同,则返回之前首元素中相同的字符串。

string longestPrefix(vector<string>& strs) 
{
	if(!strs.size())
		 return "";
    int l = strs[0].size();//定义字符串数组首元素长度
    int n = strs.size();//定义字符串数组长度
    for(int i=0;i<l;i++)//遍历字符串数组首元素
    {
        char s = strs[0][i];//将首元素中的字符赋值给s
        for(int j=1;j<n;j++)//遍历数组元素,从第二个元素开始
        {
        	//如果其它元素的长度是首元素前i的长度(说明其它元素在首元素中有公共的部分),或者其它元素中的第i个字符不等于首元素的第i个字符,则返回首元素字符串到i的长度。
            if(i==strs[j].size() || strs[j][i] != s) 
            	return strs[0].substr(0,i);
        }
    }
    return strs[0];
}

int main()
{
	string s[3]={"flower","flow","flight"};
	string s1[3]={"dog","racecar","car"};
	vector<string> v(s,s+3);
	vector<string> v1(s1,s1+3);
	cout<<longestPrefix(v)<<endl;
	cout<<longestPrefix(v1)<<endl;
	return 0;
}

结果:
在这里插入图片描述
分析字符串数组为:{“flower”,“flow”,“flight”};
i=0时,
j=1,s=strs[0][0]=‘f’,strs[1].size()=4,strs[1][0]=‘f’,继续
j=2,s=strs[0][0]=‘f’,strs[2].size()=6,strs[2][0]=‘f’,继续

i=1时
j=1,s=strs[0][1]=‘l’,strs[1].size()=4,strs[1][1]=‘l’,继续
j=2,s=strs[0][1]=‘l’,strs[2].size()=6,strs[2][1]=‘l’,继续

i=2时
j=1,s=strs[0][2]=‘o’,strs[1].size()=4,strs[1][2]=‘o’,继续
j=2,s=strs[0][2]=‘o’,strs[2].size()=6,strs[2][2]=‘i’,不符合,返回strs[0].substr(0,2)=“fl”;

总结:这种方法是将字符串数组中的首元素中每个字符其它元素的每个字符进行比较,倘若首元素中的某个字符其它元素对应位置的字符不同,就返回首元素之前相同的字符串。

先将首元素的第一个字符和其它元素的第一个字符比较
flower,flow,flight,都是’f’,继续第二个字符比较
flower,flow,flight,都是’l’,继续第三个字符比较
flower,flow,flight,前两个为’o’,第三个为’i’,不符合,返回首元素前两个字符串’fl’。

方法二
将首元素作为基础元素,然后从首元素第一个字符开始,判断所有元素第一个字符是否一致,如果第一个字符不一致,直接返回"";再判断其他元素中是否包含首元素前两个字符,如果不包含,则返回首元素第一个字符,如果包含,则继续判断首元素前三个字符是否一致,这样可以找到最大的,其它元素包含首元素的字符串。

string longestPrefix1(vector<string>& strs) 
{
	string::size_type position;
	if(!strs.size()) return "";
    int l = strs[0].size();
    int n = strs.size();
	for(int i=l;i>0;i--)
    {
        string s = strs[0].substr(0,l-i+1);
        for(int j=1;j<n;j++)
        {
			position=strs[j].find(s);
			if(strs[0][0]!=strs[j][0])
				return "";
            if(position==strs[j].npos)
				return strs[0].substr(0,l-i);
        }
    }
    return strs[0];
}
int main()
{
	string s[3]={"fxlw1111","fxlv2","fxliv3"};
	string s1[3]={"dog","pig","car"};
	vector<string> v(s,s+3);
	vector<string> v1(s1,s1+3);
	cout<<longestPrefix1(v)<<endl;
	cout<<longestPrefix1(v1)<<endl;
}

结果:

在这里插入图片描述
分析:
“fxlw1111”,“fxlv2”,“fxliv3”
i=8时:
j=1时
s = strs[0].substr(0,1)=‘f’;strs[1]可以找到’f’,继续
j=2时
strs[2]可以找到’f’,继续

i=7时
j=1时
s=strs[0].substr(0,2)=“fx”,strs[1]可以找到’fx’,继续
j=2时
strs[2]可以找到’fx’,继续

i=6时
j=1时
s=strs[0].substr(0,3)=“fxl”,strs[1]可以找到’fxl’,继续
j=2时
strs[2]可以找到’fxl’,继续

i=5时
j=1时
s=strs[0].substr(0,4)=“fxl”,strs[1]找不到’fxlw’,return strs[0].substr(0,8-5)=‘fxl’;

总结:这种方法就是将首元素的字符进行增加,直到找到不符合的情况,返回已经增加的字符串

具体的比较过程如下:
fxlw1111,fxlv2,fxliv3 √
fxlw1111,fxlv2,fxliv3 √
fxlw1111,fxlv2,fxliv3 √
fxlw1111,fxlv2,fxliv3 ×

以上就是最长公共前缀的两种解题方法。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/baidu_41191295/article/details/112396940
今日推荐