题解 | #最长公共前缀#
最长公共前缀
https://www.nowcoder.com/practice/28eb3175488f4434a4a6207f6f484f47
2022.0824算法第42题最长公共前缀
横向比较,先判断前两个的最长公共前缀,然后用得到的结果与后面的字符串比较
每个更新最长公共前缀,最终得到全部字符串的最长公共前缀。
获取两个字符串的前缀方法,while循环找到第一个不相等的位置即可,我刚开始为什么会觉着需要双层循环?
前缀的起点已经固定了,而且两个字符串的终点一致,只需要一个变量就能够把所有情况表示出来。
//获取两个字符串的最长公共前缀 string getPrefix(string str1,string str2){ //记录第一个不相等的位置 int i=0; //确保不越界,取两个字符串的最小值 int minL=min(str1.size(),str2.size()); //当字符串中的第i个字符相等时,继续寻找下一个 while(i<minL&&str1[i]==str2[i]){ i++; } //获取前缀子串 return str1.substr(0,i); } string longestCommonPrefix(vector<string>& strs) { //空字符串的情况,下面默认最少一个 if(strs.size()==0){ return ""; } //这里最少要有一个元素,可以认为第一个元素于第一个元素的最长公共前缀 string prefix=strs[0]; //循环比较前缀和当前字符串的最长公共前缀 for(int i=1;i<strs.size();i++){ //计算当前字符串与前面最长公共前缀的最长公共前缀 prefix=getPrefix(prefix, strs[i]); } //返回前缀 return prefix; }