【LeetCode-字符串】最长公共前缀

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例

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

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

题目链接: https://leetcode-cn.com/problems/longest-common-prefix/

思路1

首先找到最短的字符串,然后遍历最短的字符串,将当前位和其余字符串作比较:如果其余字符串的当前位和最短字符串的当前位全部相等,则比较下一位;如果有一个不相等,则循环终止,从字符串开始位置到当前位置的前一位就是最长的公共前缀(其实不需要根据最短字符串进行比较,随便找一个字符串作为基准比较就行了)。代码如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";

        int shortest = 0x7fffffff;
        string shortestStr = "";
        for(int i=0; i<strs.size(); i++){
            if(strs[i].length()<shortest){
                shortest = strs[i].length();
                shortestStr = strs[i];
            }
        }

        int i=0;
        while(i<shortest){
            bool breakFlag = false;
            for(int j=0; j<strs.size(); j++){
                if(strs[j][i]!=shortestStr[i]){
                    breakFlag = true;
                    break;
                }
            }
            if(breakFlag) break;
            i++;
        }
        return shortestStr.substr(0,i);
    }
};
  • 时间复杂度:O(n)
    n是字符串数组的长度。最坏情况下为O(n*m),其中m是最短字符串的长度。
  • 空间复杂度:O(1)

思路2

首先选择一个字符串当做目前的前缀,不妨选第一个,然后判断目前的前缀是否是第二个字符串的前缀:如果不是,则将当前的前缀最后一个字符去掉,如果去掉后当前前缀为空,则直接返回;如果去掉后不为空且是第二个字符串的前缀;那么继续通过同样的方法比较第三个字符串,直至比较一遍或者前缀为空,如果比较结束后,当前前缀不为空,则当前前缀就是最长的公共前缀。代码如下:

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";

        string prefix = strs[0];
        for(int i=1; i<strs.size(); i++){
            while(strs[i].find(prefix)!=0){    // prefix不是strs[i]的前缀
                prefix.pop_back(); // 删除prefix的最后一个字符
                if(prefix.empty()) return prefix;
            }
        }
        return prefix;
    }
};
  • 时间复杂度:O(n)
    n为字符串数组的长度。
  • 空间复杂度:O(1)
posted @ 2020-04-12 18:04  Flix  阅读(1296)  评论(0编辑  收藏  举报