编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串
- 常规法,用第一个字符串依次作检验
string longestCommonPrefix(vector<string>& strs) {
string ans;
if(!strs.size())
return ans;
char ch;
int min_circle = strs[0].size();
for(string i : strs)
min_circle = (i.size() > min_circle)? min_circle:i.size();
for(int i = 0; i < min_circle; i++)
{
ch = strs[0][i];
for(int j = 1; j < strs.size(); j++)
{
if(strs[j][i] != ch)
return ans;
}
ans += ch;
}
return ans;
}
2. 字符串裁剪法
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) return "";//strs无字符串,则为空
string prefix = strs[0];//假设第一个字符串为公共前缀
for (int i=1;i<strs.size();i++)//判断每一个字符串中是否含有prefix,
{
while (strs[i].find(prefix)!=0)//如果不含有prefix,则将prefix长度减1,再次判断prefix-1是否为其子串(==0表示含有该字串),直到prefix为空,
{
if (prefix == "") return "";//prefix为空串,则说明公共前缀为空
prefix = prefix.substr(0, prefix.length() - 1);
}
}
return prefix;
}
3. 双指针法,本质和第一种解法一样,只是省略了求最小长度的过程
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0) return "";
string result = "";
for (int i=0;i<strs[0].size();i++)
{
for (int j=1;j<strs.size();j++)
{
if (strs[0][i]!=strs[j][i])
{
return result;//当前的result即为最长公共前缀
}
}
result += strs[0][i];
}
return result;
}
4. 截除末尾法
string longestCommonPrefix(vector<string>& strs) {
if(strs.empty()) return "";//如果容器为空,则返回“”
string res=strs[0];//选择第一个字符串作为对照标准
for(int i=1;i<strs.size();i++)
{
for(int j=0;j<res.length();j++)
{
if(res[j]==strs[i][j])
continue;
else
{
res.erase(j);//找到第一个不符合的字符位置,从pos=j处开始删除直至结尾
break;
}
}
}
return res;
}
当j是迭代器的时候erase(j)是删除位置j上的字符,如果j是数字的话就删除从位置j到结尾的所有字符。