题目描述
题目分析
寻找最长公共前缀,便是寻找字符串数组中,所有字符串的公共值,而公共值由索引标号决定,因此目标就是找到字符串数组中对应的索引编号。
解法1:横向扫描
将字符串数组中的第一个字符串存入变量中,然后使用该变量与字符串数组中的第二个字符串进行比较,直到找到公共前缀和相对应的索引编号后,下次便使用公共前缀与下一个字符串再比较,因此类推最终找到最长公共前缀。
参考文章:最长公共前缀
代码实现
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0) return "";
string a1 = strs[0];
int i,j,index = strs[0].size();
for(i = 1; i < strs.size(); i++){
for(j = 0; a1[j] == strs[i][j] && j < index; j++); //通过j < index来控制得到的为索引编号值最小
index = j; //注意:for循环先执行了j++,得到的判断不符条件才跳出循环,因此我们此时获取最长公共前缀的索引编号应该为index-1
}
return a1.substr(0,index); //substr(0,index)会选择从索引标号0开始,往后index个长度的字符串,也就是最后获取的那个字符串的索引编号为index-1
}
};
时间复杂度O(mn),空间复杂度为O(1)。
其中m是字符串中的字符串平均长度,n是字符串的数量。
解法2:纵向扫描
将字符串数组中的第一个字符串作为比较,先获取该字符串中的第一个字符,然后和其余几个字符串中的第一个字符进行比较,均相等后,比较第二个字符。若在其中出现不相等,则说明找到了最长公共前缀。
代码实现
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0) return "";
char c;
for(int i = 0; i < strs[0].size(); i++){
c = strs[0][i];
for(int j = 1; j < strs.size(); j++){
if(i == strs[j].size() || c != strs[j][i])
return strs[0].substr(0, i);
}
}
return strs[0];
}
};
时间复杂度O(mn),空间复杂度为O(1)。
其中m是字符串中的字符串平均长度,n是字符串的数量。