LeetCode刷题记录——14最长公共前缀
一 题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回字符串“”。
示例:
-
输入: ["flower","flow","flight"] 输出: "fl"
-
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
【说明】所有输入只包含小写字母a-z
二 思路:
1)
-
依次遍历字符串,两两匹配,得到两个字符串的最长前缀,然后再与下一个字符串进行匹配,得到最终的答案
-
代码:
-
class Solution { public: string longestCommonPrefix(vector<string>& strs) { int n = strs.size(); if(n == 0){ return ""; } if(n == 1){ return strs[0]; } string ans = strs[0]; int j = 0; for(int i = 0;i<n;i++){ for(j= 0;j<ans.length();j++){ if(ans[j] != strs[i][j]) break; } ans = ans.substr(0,j); //中途一旦发现没有公共前缀,直接返回空 if(ans == "") return ans; } return ans; } };
-
2)
-
对于这样一系列的字符串来讲,其中字序最低和最高的中间一定存在和最小字典序的前缀,因此只需要比较最小字典序和最大字典序的字符串即可得到答案,于是先排序数组,然后直接比较第一个和最后一个字符串即可
-
比如: {"abcd","abcde","abcdf","abcdg","abcdef","abcdefg"} 那么显然中间的和第一个具有相同的前缀,不需要多余的比较,因为我们是求得是最长公共前缀,因此可以略去中间项,考虑第一项和最后一项
-
代码
-
class Solution { public: string longestCommonPrefix(vector<string>& strs) { int n = strs.size(); if(n == 0){ return ""; } if(n == 1){ return strs[0]; } //排序数组,使之成有序的状态 sort(strs.begin(),strs.end()); //比较第一个和最后一个字符串得到答案 for(int i = 0;i<min(strs[0].length(),strs[n-1].length());i++){ if(strs[0][i] != strs[n-1][i]) return strs[0].substr(0,i); } return strs[0].length() > strs[n-1].length() ? strs[n-1] : strs[0]; } };
-