题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
思路分析:
纵向对比法
这种方法最容易想到,以第一个字符串为模板
依次扫描每个字符串第一个字符,相等就扫描第二个字符,但是要注意每个字符串的长短不一样,当遍历的字符超出长度或者不相等就返回前面的字符串。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int n = strs[0].size();
int sz = strs.size();
for(int i = 0; i < n; i++)
{
char ch = strs[0][i];
for(int j = 0; j < sz; j++)
{
if(i >= strs[j].size() || strs[j][i] != ch)
{
return strs[0].substr(0, i);
}
}
}
return strs[0].substr(0);
}
};
横向对比
举个例子:
可以两个两个字符串对比,返回相同的字符串,再拿这个相同的字符串跟后边的对比。
特殊情况:
如果返回的字符串是空串就不用对比了,直接返回空串。
class Solution {
public:
string Common(const string& s1, const string& s2)
{
int n = min(s1.size(), s2.size());
for(int i = 0; i < n; i++)
{
if(s1[i] != s2[i])
{
return s1.substr(0, i);
}
}
return s1.substr(0, n);
}
string longestCommonPrefix(vector<string>& strs) {
int sz = strs.size();
string PreString = strs[0];
for(int i = 0; i < sz - 1; i++)
{
if(PreString.empty())// 为空就返回空串
{
return string();
}
PreString = Common(PreString, strs[i + 1]);
}
return PreString;
}
};
排序比较
先把所有字符串排序,然后直接比较第一个和最后一个串即可,比较方法跟上面的一样。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
sort(strs.begin(), strs.end());//排序
string start = strs.front(), end = strs.back();
int n = min(start.size(), end.size());
for(int i = 0; i < n; i++)
{
if(start[i] != end[i])
{
return start.substr(0, i);
}
}
return start.substr(0);
}
};
纸上得来终觉浅,绝知此事要躬行。