leetcode第14題-最長公共前綴

2021-03-02 測試工程師小站

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

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

示例 1:

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

示例 2:

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

說明:
所有輸入只包含小寫字母 a-z 。

來源:力扣(LeetCode)
連結:
https://leetcode-cn.com/problems/longest-common-prefix

解答

def longestCommonPrefix(strs):
    """
    縱向掃描,將所有字符串縱向排序,從第1個字母依次往後對比,
    第1個不全相同的字母之前的則是最長公共前綴。
    :type strs: List[str]
    :rtype: str
    """
    if not strs:
        return ''
    result = ''
    strs.sort(key=len)  # 將列表按字符串長度從小到大排序
    for i in range(len(strs[0])):
        letter = strs[0][i]
        for n in range(len(strs)):
            if strs[n][i] != letter:
                return result
        result += letter
    return result


def longestCommonPrefix1(strs):
    """
    大神方法1:利用python的max()和min(),在Python裡字符串是可以比較的,
    按照ascII值排,舉例abb,aba,abac,最大為abb,最小為aba。
    所以只需要比較最大最小的公共前綴就是整個數組的公共前綴。
    """
    if not strs:
        return ''
    s1 = min(strs)
    s2 = max(strs)
    for i, x in enumerate(s1):
        if x != s2[i]:
            return s2[:i]
    return s1


def longestCommonPrefix2(strs):
    """
    大神方法2:利用python的zip函數,把str看成list然後把輸入看成二維數組,
    左對齊縱向壓縮,然後把每項利用集合去重,
    之後遍歷list中找到元素長度大於1之前的就是公共前綴。
    """
    if not strs:
        return ''
    result = ''
    s = map(set, zip(*strs))
    print s
    for i, x in enumerate(s):
        x = list(x)
        if len(x) > 1:
            break
        result += x[0]
    return result


if __name__ == "__main__":
    s1 = ["flower", "flow", "flight"]
    s2 = ["dog", "racecar", "car"]
    s3 = ["flower", "flow", "flowight"]
    s4 = ['abc', 'bbbb', 'abcdef']
    print longestCommonPrefix2(s1)

相關焦點

  • 最長公共前綴 | Leetcode題解
    題目描述:編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 "" 。思路1:當字符串數組長度為 0 時則公共前綴為空,直接返回令最長公共前綴 ans 的值為第一個字符串,進行初始化遍歷後面的字符串,依次將其與 ans 進行比較,兩兩找出公共前綴,最終結果即為最長公共前綴如果查找過程中出現了 ans 為空的情況,則公共前綴不存在直接返回時間複雜度:O(s)O(s)O(s),s 為所有字符串的長度之和思路2:當字符串數組長度為 0 時則公共前綴為空,直接返回令最長公共前綴
  • LeetCode-14. Longest Common Prefix | 最長公共前綴
    題解這道題目的簡單描述就是找一堆字符串的相同前綴,比如flower、flow、flight,發現每個字符串都有前綴fl,於是就將fl返回即可,本題就是要實現這樣一個在字符串數組中找最長前綴的函數。  } prefix = prefix[:len(prefix) - 1] } } return prefix}執行結果:力扣:執行用時:0 ms, 在所有 Go 提交中擊敗了100.00%的用戶內存消耗:2.3 MB, 在所有 Go 提交中擊敗了55.76%的用戶leetcode
  • leetcode刷題指南之shortestPalindrome
    當我們發現走了k個字母後,s的後綴和h的前綴相等了,我們就找到了回文中心,也就是這個相等的s的後綴串(h的前綴串)的中心。因為h是s逆轉來的,相當於在相等的這段後綴串中是滿足上述條件的,所以只需要把不滿足條件的前k個字母放到s的後面即可。再進一步抽象,我們需要找到一個h的一個最長的前綴,使得它等於s的後綴。
  • 掌握前綴表達式真的可以為所欲為!
    思路比較常見的是前綴和,這個概念其實很容易理解,即一個數組中,第 n 位存儲的是數組前 n 個數字的和。對 [1,2,3,4,5,6] 來說,其前綴和可以是 pre=[1,3,6,10,15,21]。我們可以使用公式 pre[𝑖]=pre[𝑖−1]+nums[𝑖]得到每一位前綴和的值,從而通過前綴和進行相應的計算和解題。其實前綴和的概念很簡單,但困難的是如何在題目中使用前綴和以及如何使用前綴和的關係來進行解題。
  • [LeetCode] 1143. Longest Common Subsequence 最長公共子序列
    Constraints:這道題讓求最長相同的子序列,注意是子序列,不是子串,所以字符並不需要相連,但是字符順序還是需要保持的。LeetCode 之前也有題目需要藉助求 LCS 來解題,比如 Delete Operation for Two Strings,當時博主還疑惑怎麼 LeetCode 中沒有專門求 LCS 的題呢,這不,終於補上了。
  • LeetCode 系列 第5題
    複習了一下第5題, 這篇文章Review一下思路和代碼P0005
  • 最長回文子串 | Leetcode題解
    題目描述給定一個字符串 s,找到 s 中最長的回文子串。你可以假設  s 的最大長度為 1000。」的子串進行「回文驗證」;在記錄最長回文子串的時候,可以只記錄「當前子串的起始位置」和「子串長度」,不必做截取。
  • 笨方法刷 leetcode(一)
    )本篇記錄5道題的解題思路,可能都是最笨的方法示例 2:輸入: s = "abc"輸出: true限制:0 <= len(s) <= 100原題連結:https://leetcode-cn.com/problems/is-unique-lcci/解決思路:
  • Leetcode刷題-動態規劃
    本文對leetcode上部分動態規劃問題進行分析並用python實現5. 最長回文子串 題目描述給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。提示:思路:令dp(i,j)表示從第i到j個字母之間最大回文子序列的長度,那麼和上面第五題一樣,我們上面的轉移方程只適用於子串長度大於等於3 的,對於小於3的,我們有:
  • leetcode刷題指南之RussianDollEnvelopes
    這樣,這道題目就成了一個經典的dp問題,即最長上升子序列問題。接下來我們就可以寫一個O(n^2)的最長上升子序列,或者也可以寫一個O(nlgn)的算法。3. 9    int dp[n];10    for(int i=0;i<n;i++)    dp[i]=1;11    for(int i=1;i<n;i++)12        for(int j=0;j<i;j++)13            if(envelopes[i].first>envelopes[j].first14
  • leetcode-14. Longest Common Prefix
    題目描述(簡單難度)編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 ""。我們將字符串水平排列,尋找第0 個和第 1 個字符串的最長子串,結果為 fl,再把結果和第 2 個字符串比較,結果為 fi,即為最終結果。
  • 初級樹狀數組 leetcode 練習題
    分享幾個簡單的樹狀數組練習題。一、背景之前分享了《樹狀數組模板》和《離散化模板》,今天來看幾道練習題。
  • [LeetCode] 1027. Longest Arithmetic Subsequence 最長的等差數列
    Constraints:•2 <= A.length <= 1000•0 <= A[i] <= 500這道題給了一個數組,讓找最長的等差數列的長度,暴力搜索的時間複雜度太大,這裡就不考慮了。
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。刷題時避免不了會有挫敗感的,每次覺得自己很nb了,還是會在一些題上卡住。
  • 字節大佬Leetcode刷題筆記,看完吊打問你算法的面試官
    介紹leetcode 題解,記錄自己的 leetcode 解題之路。目前分為五個部分:第一個部分是 leetcode 經典題目的解析,包括思路,關鍵點和具體的代碼實現。第四部分是每日一題,每日一題是在交流群(包括微信和 qq)裡進行的一種活動,大家一起 解一道題,這樣討論問題更加集中,會得到更多的反饋。而且 這些題目可以被記錄下來,日後會進行篩選添加到倉庫的題解模塊。
  • [每日一題]14. Longest Common Prefix
    本題的思路有如下幾種暴力法排序方法二分法分治算法遞歸Trie 樹思路很直接,用一個變量保存第一個字符串,然後循環求第一字符串 數組中其餘所有的字符串的最長公共前綴,不斷的更新變量的值,保存最小的前綴即可。
  • Leetcode weekly contest三月小結
    」這個條件,所以moments = 2;在第4個時刻,打開燈泡4,由於燈泡1-5現在都被打開,所有開著的燈泡滿足條件,所以 moments = moments + 1 = 3;最後返回 moments=3解法:這題是這次競賽中困擾我最久的第一題。
  • leetcode 刷500道題,筆試/面試穩嗎?
    一、先說說筆試題在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你幹嘛了,並且每道題所用道的算法思想都很明確,動態規劃、遞歸、二分查找等,你可能很快就知道該用哪種方法,只是你不懂如何把代碼寫出來而已。
  • 第五題:最長回文子串【leetcode】
    給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
  • Leetcode刷題-字符串
    字符串其實可以看成是字符組成的數組,在leetcode中一般會有以下幾種題型:不同的字符串題方法也不同,下面具體介紹了5個涉及字符串題的解題思路和python解決方案尤其最後一題尋找最長回文子串問題中,給出了全新的動態規劃思路