LeetCode:Longest Common Prefix


題目鏈接

Write a function to find the longest common prefix string amongst an array of strings.


題目的意思說的不是很清楚,開始理解成了求任意兩個字符串的前綴中的最長者。但是本題的意思是求所有字符串的最長公共前綴,即數組的所有字符串都包含這個前綴。

算法1:逐個字符比較,時間復雜度為O(N*L),N是字符串個數,L是最長前綴的長度

class Solution {
public:
    string longestCommonPrefix(vector<string> &strs) {
        int n = strs.size();
        string res;
        if(n == 0)return res;
        for(int pos = 0; pos < strs[0].size(); pos++)//最長前綴的長度不超過strs[0].size(),逐個字符的比較
        {
            for(int k = 1; k < n; k++)//strs[0]的第pos個字符分別和strs[1...n-1]的第pos個字符比較
            {
                if(strs[k].size() == pos || strs[k][pos] != strs[0][pos])
                    return res;
            }
            res.push_back(strs[0][pos]);
        }
        return res;
    }
};

============================

算法2:第0個字符串和其他字符串逐個求前綴 ,所有字符串的最長前綴長度 = min{ prefixLength(strs[0], strs[i]) ,  0 < i < n }     本文地址

class Solution {
public:
    string longestCommonPrefix(vector<string> &strs) {
        int n = strs.size();
        if(n == 0)return "";
        int len = strs[0].size();//最長前綴的長度
        for(int i = 1; i < n; i++)
        {
            int k;
            for(k = 0; k < min(len, (int)strs[i].size()); k++)
                if(strs[0][k] != strs[i][k])break;
            if(len > k)len = k;
        }
        return strs[0].substr(0, len);
    }
};

 

算法2的時間復雜度是O(N*M),N是字符串個數,M = strs[0]和其他字符串的前綴長度的平均值, 算法2中字符的比較次數要比算法1多。例如以下例子

 

strs[0]: abcdef

strs[1: abcde

strs[2: abcdk

strs[3]ab

按照算法1,只需要比較每個字符串的前3個字符;按照算法2,strs[0]和其他三個字符串分表需要比較6、5、3個字符

 

【版權聲明】轉載請注明出處:http://www.cnblogs.com/TenosDoIt/p/3856331.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM