1. 程式人生 > 其它 >LeetCode刷題(5)--最長公共字首詳解

LeetCode刷題(5)--最長公共字首詳解

技術標籤:刷題!!!字串leetcode演算法

題目描述

編寫一個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串 “”。

示例:
輸入: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的長度。
            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 ×

以上就是最長公共字首的兩種解題方法。

在這裡插入圖片描述