题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
思路
考虑个数已知的情况
先尝试写出给定元素个数的情况,找一找思路。选择strs = ["flower","flow","flight"]
int main()
{
string strs_1 = "flower";
string strs_2 = "flow";
string strs_3 = "flight";
string str_com;
string str_com_final;
for(size_t i=0;i<min(strs_1.size(),strs_2.size());i++) //size_t是unsigned int类型,因为size一定为正,这样可以防止警告
{
if(strs_1[i]==strs_2[i])
str_com+=strs_1[i]; //+=和push.back()等价,都是在数组尾部添加并自动增长数组的。
//直接对str_com[i]赋值无效,因为str_com的长度为0,这也是可以运行但没有输出的原因。
else
break; //找到第一个不一致的元素则直接退出循环。
}
for(size_t i=0;i<min(str_com.size(),strs_3.size());i++)
{
if(str_com[i]==strs_3[i])
str_com_final+=strs_3[i];
}
for(size_t j=0;j<str_com_final.size();j++)
{
cout<<str_com_final[j];
}
return 0;
}
我们先将strs_1和strs_2中的相同元素找出来,存入str_com数组中,若遇到第一个不同元素则跳出循环。再将str_com与strs_3中的相同元素找出来存入str_com_final,同样遇到第一个不同元素则跳出循环。str_com_final即为三者的公共前缀。
考虑个数未知的情况
封装函数
我们可以把两个字符串找公共前缀的过程写成一个函数,返回值为公共前缀的字符串。
string common_prefix(vector<string>& strs,string str_compare,int count)
{
string str_com;
for(size_t j=0;j<min(str_compare.size(),strs[count].size());j++) //size_t是unsigned int类型,因为size一定为正,这样可以防止警告
{
if(str_compare[j]==strs[count][j])
str_com+=strs[count][j]; //+=和push.back()等价,都是在数组尾部添加并自动增长数组的。
//直接对str_com[i]赋值无效,因为str_com的长度为0,这也是可以运行但没有输出的原因。
else
break; //找到第一个不一致的元素则直接退出循环。
}
return str_com;
}
如上函数的作用是找到strs[count]与str_compare的公共前缀str_com并将其作为返回值。
实现功能
string str_com=strs[0];
for(size_t i=0;i<strs.size();i++)
{
str_com=common_prefix(strs,str_com,i);
}
首先将strs[0]的值给str_com,相当于给str_com一个初始的字符串。接着从str[1]开始与str_com找公共前缀,公共前缀再作为新的str_com,与str[2]找公共前缀......,最终的str_com即为strs数组中各个字符串的公共前缀。
总结
该方法可以通过leetcode的测试,但似乎在执行速度上有所欠缺......