14. 最长公共前缀
2019-06-05 本文已影响1人
046ef6b0df68
文|Seraph
01 | 问题
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
02 |解题
这里一定要注意题目说的是前缀
,如误认为是子串,则会曲解题意。
大概就是从前往后轮训每个字符串,如有任何一个字符串该前缀的字符不一致,则退出即可。
最长的公共前缀则为依据轮训过的字符。
初解:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int iSize = strs.size();
if(iSize == 0)
return "";
if(iSize == 1)
return strs[0];
bool flag=true;
int j=0;
while(flag)
{
for(int i=0; i<iSize-1; i++)
{
if(strs[i][j]=='/0' || strs[i+1][j]=='/0' || strs[i][j]!=strs[i+1][j])
{
flag=false;
break;
}
}
j++;
}
string result;
result = strs[0].substr(0, j-1);
return result;
}
};
终解:
可以先检查最短的字符串的长度,减少循环内的判断。
任何执行语句能在循环外执行的,一定不要拖到循环内。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string result;
int size = strs.size();
if (size==0) return result;
int minlen = strs[0].length();
for (int i=0; i<size; i++)
{
minlen = min((int)strs[i].size(), minlen);
}
for (int i=0; i<minlen; i++)
{
int j = 0;
for (j=0; j<size-1; j++)
{
if (strs[j][i]!=strs[j+1][i]) break;
}
if (j==size-1) result.push_back(strs[0][i]);
else break;
}
return result;
}
};
03 | 积累知识点
- string截取子串函数
substr(start, end)
。