14:最長公共前綴(C++)


題目地址:https://leetcode-cn.com/problems/longest-common-prefix/

題目描述

編寫一個函數來查找字符串數組中的最長公共前綴。

如果不存在公共前綴,返回空字符串 ""

題目示例

示例 1:

輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:

輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。

解題思路

思路1:我們對字符串數組strs,依次遍歷其中的每個字符串(單詞),對於每個遍歷到的字符串,更新最長公共前綴,當遍歷完所有的字符串以后,即可得到字符串數組中的最長公共前綴prefix。時間復雜度O(mn),其中m為字符串數組中的字符串的平均長度,n為字符串數組的長度,空間復雜度O(1)。

思路2:國際站一位老哥代碼,個人感覺非常容易理解。思路主要是先對字符串數組進行排序,然后選擇排好序之后的字符串數組中的第一個和最后一個字符串,最后比較兩個字符串從下標0開始有多少個公共字符。

程序源碼

思路1

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()) return ""; //字符串數組沒有字符串
        string prefix = strs[0];
        for(int i = 1; i < strs.size(); i++)
        {
            prefix = longestCommonPrefix(prefix, strs[i]);
            if(prefix.empty())
            {
                break;
            }
        }
        return prefix;
    }

    string longestCommonPrefix(string& s1, string& s2)
    {
        int word_len = min(s1.size(), s2.size());
        int index = 0;
        while(index < word_len && s1[index] == s2[index])
        {
            index++;
        }
        return s1.substr(0, index);
    }
};

精簡代碼

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
       string prefix = strs.size()? strs[0] : "";
       for(auto str : strs)
       {
           while(str.substr(0, prefix.size()) != prefix)
           {
               prefix = prefix.substr(0, prefix.size() - 1);
               if(prefix == "") return prefix;
           }
       }
        return prefix;
     }
};

思路2

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
       if(!strs.size()) return "";
       string prefix = "";
       sort(begin(strs), end(strs));
       string sa = strs[0];
       string sb = strs[strs.size() - 1];

       for(int i = 0; i < sa.size(); ++i)
       {
           if(sa[i] == sb[i])
           {
               prefix += sa[i];
           }
           else
                break;
       } 
        return prefix;
     }
};


免責聲明!

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



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