leetcode14. 最长公共前缀

文章目录

    • 题目:leetcode14. 最长公共前缀
    • 基本思想1:纵向扫描
    • 基本思想2:横向扫描
    • 基本思想3:分治
    • 基本思想4:二分法

题目:leetcode14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:

  • 所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

基本思想1:纵向扫描

以第一个字符串的每一个字符为基准,扫描每一个字符串相应下标的字符串。
注意:这里涉及到两重循环,这两重循环都是扫描到一个满足条件的就终止循环

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size() == 0)
            return "";
        string res = "";
        for(int j, i = 0; i < strs[0].size(); ++i){
            
            for(j = 1; j < strs.size(); ++j){
                if(i >= strs[j].size() || strs[0][i] != strs[j][i])
                    break;
            }
            
            if(j == strs.size())
                res += strs[0][i];
            else
                break;
        }
        return res;
    }
};

基本思想2:横向扫描

遍历每一个字符串,初始时,求第一个和第二个字符的公共前缀prefix,然后求prefix和第三个字符的公共前缀,一直遍历到最后。
如果在遍历的过程中出现公共前缀为空,那么直接终止循环返回结果
时间复杂度:O(nm),n是字符串的数量,m是字符串的平均长度

基本思想3:分治

将字符串分成两部分,求左面的公共前缀pre1,求右面的公共前缀pre2,最终的公共前缀就是pre1和pre2的公共前缀
时间复杂度:这里有点疑问??我认为是O(mlogn),题解中给的是T(n) = T(n/2) + O(m),O(mn)
空间复杂度:O(mlogn),递归深度是logn,每次都需要m个空间返回结果

基本思想4:二分法

对字符串中的长度最小的字符串进行二分。
时间复杂度:O(mnlogm)

你可能感兴趣的:(leetcode14. 最长公共前缀)