国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【python】求最長連續(xù)公共子序列長度的幾種解法

這篇具有很好參考價(jià)值的文章主要介紹了【python】求最長連續(xù)公共子序列長度的幾種解法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目:

?

給定兩個(gè)序列X和Y,返回最長連續(xù)的公共子序列長度。如果沒有連續(xù)公共子序列,返回0.

X和Y的元素都是整數(shù)。

示例:

輸入:

1 5 7 3 4 5
7 3 4 4 5 7 -2

輸出:

3

?說明:

最長的連續(xù)公共子序列是[7,3,4] (X[2:4] 和Y[0:2])

這道題在【leetcode1143】的基礎(chǔ)上增加了公共子序列連續(xù)的限制。解法可以有以下幾種:

題解:

1. 動態(tài)規(guī)劃

創(chuàng)建m+1 行?n+1 列的二維數(shù)組dp,其中?dp[i][j] 表示 a和b分別以a[i-1],b[j-1]結(jié)尾的最長公共子序列的長度。

可以得到狀態(tài)轉(zhuǎn)移方程如下:

python 最長連續(xù)子序列,刷題日記,動態(tài)規(guī)劃,python,hash,算法

最終計(jì)算dp中的最大值即為最長公共連續(xù)子序列的長度。

def findLength(a,b):
    m,n=len(a),len(b)
    maxlength=0
    dp=[[0]*(n+1) for i in range(m+1)]
    for i in range(m+1):
        for j in range(n+1):
            if a[i-1]==b[j-1]:
                dp[i][j]=dp[i-1][j-1]+1
                maxlength=max(maxlength,dp[i][j])
    return maxlength

時(shí)間復(fù)雜度:O(mn)

空間復(fù)雜度:O(mn),可以優(yōu)化至O(m)或O(n)(只存儲dp矩陣的兩列進(jìn)行計(jì)算)

2. 后綴數(shù)組

def longestCommonSubstring(A, B):
    if A == None or B == None:
        return
    C = [9999]
    s = A + C + B
    indexOfSharp = len(A)
    SA = suffixArray(s)
    maxLen, maxIndex = 0, 0
    hasCommon = False
    for i in range(len(s) - 1):
        # 判斷后綴數(shù)組中兩個(gè)相鄰元素對應(yīng)的后綴字符串是否位于“#”兩側(cè),即是否屬于A和B兩個(gè)不同字符串
        diff = (SA[i] - indexOfSharp) * (SA[i + 1] - indexOfSharp)
        if diff < 0:
            tempLen = comlen(s, SA[i], SA[i + 1])
            if tempLen > maxLen:
                maxLen = tempLen
                maxIndex = SA[i]
                hasCommon = True
    return (maxLen, s[maxIndex:maxIndex + maxLen]) if hasCommon else False
# 得到一個(gè)字符串的后綴數(shù)組
def suffixArray(s):
    if s == None or len(s) == 0:
        return None
    allSuffix = []
    for i in range(len(s)):
        allSuffix.append([s[i:], i])
    sortedList = sorted(allSuffix)
    SA = [w[1] for w in sortedList]
    return SA
# 比較得到后綴數(shù)組中兩個(gè)相鄰的元素分別對應(yīng)的后綴字符串的最長前綴
def comlen(s, p, q):
    j = 0
    while j < len(s[p:]) and j < len(s[q:]) and s[p:p + j + 1] == s[q:q + j + 1]:
        j += 1
    return j

時(shí)間復(fù)雜度:O(nlgn)

空間復(fù)雜度:O(n^2)

3. 哈希表+二分查找

設(shè)最長公共子串的長度為x,那么x在0到min(len(X),len(Y))之間,并且滿足二分的性質(zhì)。因?yàn)槿绻嬖陂L度為m的公共子序列,那么必然存在長度小于m的公共子序列。先哈希一下這兩個(gè)序列,二分長度。每次check的時(shí)候,假設(shè)判斷是否存在長度為k的公共子串,那么看字符串1和字符串2長度為k的子串的哈希值有沒有相同的,如果有返回true,沒有返回false;然后使用二分查找最長公共子串長度x.

def findLen(X, Y):
    base, mod = 113, 10**9 + 9

    def checkHash(l):

        # Construct hash value set of X[0:l]
        hx = 0
        for i in range(l):
            hx = (hx * base + X[i]) % mod
        hvx = {hx}
        pow_base = pow(base, l - 1, mod)
        for i in range(l, len(X)):
            hx = ((hx - X[i - l] * pow_base) * base + X[i]) % mod
            hvx.add(hx)
        
        # Construct hash value set of Y[0:l] and check whether there is an hash value that matches 
        hy = 0
        for i in range(l):
            hy = (hy * base + Y[i]) % mod
        if hy in hvx:
            return True
        for i in range(l, len(Y)):
            hy = ((hy - Y[i - l] * pow_base) * base + Y[i]) % mod
            if hy in hvx:
                return True

        return False

    # Binary Search
    l, r = 0, min(len(X), len(Y))
    res = 0
    while l <= r:
        m = (l + r) // 2
        if checkHash(m):
            res = m
            l = m + 1
        else:
            r = m - 1
    return res

時(shí)間復(fù)雜度:O(nlogn)

空間復(fù)雜度:O(n)

4.雙指針文章來源地址http://www.zghlxwxcb.cn/news/detail-690525.html

def findLength(a, b):
    aa = ''.join(a)
    l, s = 1, 0
    l1, l2 = len(a), len(b)
    rtn = 0
    while l <= l1 and l+s <= l2:
        e = s + l
        temp = ''.join(b[s:e])
        if temp in aa:
            rtn = max(rtn, l)
            l += 1
        else:
           if str(b[e-1]) not in aa:
                s = e
           else:
                s += 1
                
           if s + rtn >= l2:
                return rtn
    return rtn

到了這里,關(guān)于【python】求最長連續(xù)公共子序列長度的幾種解法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 接一元二次方程的幾種解法,用python代碼實(shí)現(xiàn)

    一元二次方程的解法有以下幾種:公式法、因式分解法、配方法、求根公式法。 下面是使用Python代碼實(shí)現(xiàn)一元二次方程的解法: ```python import math def solve_quadratic_equation(a, b, c): ? ? delta = b**2 - 4*a*c ? ? if delta 0: ? ? ? ? return \\\"無實(shí)根\\\" ? ? elif delta == 0: ? ? ? ? x = -b / (2*a) ? ?

    2024年02月07日
    瀏覽(22)
  • 最長公共子序列和最長公共子串

    最長公共子序列 題目描述 給出1,2,…, n 的兩個(gè)排列P 1 和 P 2 ,求它們的最長公共子序列。 輸入格式 第一行是一個(gè)數(shù) n 。 接下來兩行,每行為 n 個(gè)數(shù),為自然數(shù)1,2,…, n 的一個(gè)排列。 輸出格式 一個(gè)數(shù),即最長公共子序列的長度。 題目分析 第一階段定義dp數(shù)組 (1)考慮規(guī)模

    2024年02月19日
    瀏覽(21)
  • 最長公共子序列(詳細(xì)代碼 注釋 分析 以及求出最長公共子序列內(nèi)容方法)

    最長公共子序列(詳細(xì)代碼 注釋 分析 以及求出最長公共子序列內(nèi)容方法)

    文章有些長,希望能夠耐心看完,并且對你有幫助,文章是自己看了書之后,總結(jié)的,如果有什么錯(cuò)誤的地方,歡迎指出。 一些基本的概念: 子序列: 原序列中刪除若干個(gè)元素得到的序列,即原序列中可以不連續(xù)的一段 子串: 原序列中任意個(gè)連續(xù)的序列元素組成的序列,

    2023年04月15日
    瀏覽(22)
  • Day.1 LeetCode刷題練習(xí)(最長公共前綴 C/C++兩種解法)

    Day.1 LeetCode刷題練習(xí)(最長公共前綴 C/C++兩種解法)

    題目: 例子: 分析題目: 主要目的:求出各個(gè)字符串的公共前綴 思路(本人解法): 用所給實(shí)例來看,不難看出我們可以直接以豎著對應(yīng)來查看是否是公共前綴 ,? 這樣就有了一定的思路 , 然后接著想如何讓他找到最長的公共前綴后就 停止下來呢? 這樣就能想到,從最

    2024年02月11日
    瀏覽(26)
  • 【算法訓(xùn)練-字符串 三】最長公共子串、最長公共子序列

    【算法訓(xùn)練-字符串 三】最長公共子串、最長公共子序列

    廢話不多說,喊一句號子鼓勵(lì)自己:程序員永不失業(yè),程序員走向架構(gòu)!本篇Blog的主題是【】,使用【】這個(gè)基本的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn),這個(gè)高頻題的站點(diǎn)是: CodeTop ,篩選條件為: 目標(biāo)公司+最近一年+出現(xiàn)頻率排序 ,由高到低的去 ??蚑OP101 去找,只有兩個(gè)地方都出現(xiàn)過才做

    2024年02月09日
    瀏覽(22)
  • day55 最長遞增子序列 最長連續(xù)遞增子序列 最長重復(fù)子數(shù)組

    day55 最長遞增子序列 最長連續(xù)遞增子序列 最長重復(fù)子數(shù)組

    題目鏈接?300 最長遞增子序列 題意 找到整數(shù)數(shù)組nums的最長嚴(yán)格遞增子序列的長度(子序列并不改變原始的順序,但是可以刪除元素) 動態(tài)規(guī)劃 動規(guī)五部曲 1)dp數(shù)組及下標(biāo)i的含義 dp[i] 表示以nums[i]為結(jié)尾的最長遞增子序列的長度 2)dp數(shù)組初始化 根據(jù)定義 長度至少是1? dp

    2024年04月11日
    瀏覽(26)
  • Leetcode:300. 最長遞增子序列、674. 最長連續(xù)遞增序列(C++)

    目錄 300.?最長遞增子序列 題目描述: 實(shí)現(xiàn)代碼: 原理思路: 674.?最長連續(xù)遞增序列 題目描述: 實(shí)現(xiàn)代碼: 原理思路: 題目描述: ????????給你一個(gè)整數(shù)數(shù)組? nums ?,找到其中最長嚴(yán)格遞增子序列的長度。 子序列? 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中

    2024年02月11日
    瀏覽(32)
  • 最長公共子序列LCA

    最長公共子序列LCA

    題目鏈接:3692. 最長連續(xù)公共子序列 - AcWing題庫

    2024年02月13日
    瀏覽(19)
  • 動態(tài)規(guī)劃--最長公共子序列

    動態(tài)規(guī)劃--最長公共子序列

    動態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個(gè)子問題﹐ 即將大規(guī)模變成小規(guī)模 ,先求解子問題,然后從這些子問題的解得到原問題的解。與分治法不同的是﹐適合于用動態(tài)規(guī)劃法求解的問題,經(jīng)分解得到的子問題往往不是互相獨(dú)立的。 他們之間有關(guān)系

    2024年02月04日
    瀏覽(31)
  • 動態(tài)規(guī)劃——最長公共子序列

    動態(tài)規(guī)劃——最長公共子序列

    先來講解以下什么是最長公共子序列。最長公共子序列不是最長相同字符串,有點(diǎn)相似但不一樣,來舉個(gè)簡單的例子,有字符串s1=bcdea,s2=abce,最長相同字符串是bc,最大公共部分是2;而最長公共子序列則是bce,最大公共部分是3??梢钥闯觯沧有蛄胁恍枰B續(xù)相等,有相

    2023年04月19日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包