算法(26)-最長系列

最長系列

  • 1.LeetCode-32 最長有效括號--子串
  • 2.LeetCode-300 最長上升子序列--長度
  • 3.LeetCode-32 最長回文子串--是什么
  • 5.LeetCode-512 最長回文子序列--長度
  • 6.LeetCode-1143 最長公共子序列--長度
  • 6.LeetCode-128 最長連續序列--長度
  • 7.LeetCode-14 最長公共前綴-字符串
  • 8.劍指offer-48 最長不含重復字符串的子字符串-長度

列表-子序列(連續/不連續)
字符串-子序列(不連續),子串(連續)


1.一維dp,dp[i] --以item[i]結尾的,有效的,最長XXX的長度


1.LeetCode-32 最長有效括號–子串

題目:給定一個只包含 ‘(’ 和 ‘)’ 的字符串s,找出最長的包含有效括號的子串的長度。

dp[i] --以s[i]結尾的,有效的子串的長度中,最長的一個。

顯然有效的子串一定以)結尾,因此我們可以知道以(結尾的子串對應的dp 值必定為 0,我們只需要求解 )在dp 數組中對應位置的值。

同時因為子串要求連續,所以可以用相鄰的dp[i-2]來更新符合條件的dp[i](s[i]==")"ands[i?1]=="("=>dp[i]=dp[i?2]+2s[i]==")" and \ s[i-1]=="("=>dp[i] = dp[i-2]+2s[i]==")"and?s[i?1]=="("=>dp[i]=dp[i?2]+2})

# 1.s[i]==")" and s[i-1]=="("    dp[i] = dp[i-2]+2
# 2.s[i]==")" and s[i-1]==")"    dp[i] = dp[i-1] + dp[i-dp[i-1]-2]+2 下標的合理性
# ((xx)) dp[i-1] 也有效的情況下
def longestValidParentheses(self, s):n=len(s)if n<2:return 0dp=[0]*nres=0for i in range(1,n):if i==1:if s[i]==")" and s[i-1]=="(":dp[1]=2else:if s[i]==")" and s[i-1]=="(":dp[i]=dp[i-2]+2               if s[i]==")" and s[i-1]==")":if i-1-dp[i-1]>=0 and s[i-1-dp[i-1]]=="(":dp[i]=dp[i-1]+2 # if i-2-dp[i-1]>=0:dp[i]+=dp[i-2-dp[i-1]]res=max(res,dp[i]) return res

2.LeetCode-300 最長上升子序列–長度

題目:給定一個無序的整數數組,找到其中最長上升子序列的長度。

輸入: [10,9,2,5,3,7,101,18]
輸出: 4 
解釋: 最長的上升子序列是 [2,3,7,101],它的長度是 4

dp[i] --以nums[i]結尾的,上升序列的長度中,最長的一個。

def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""# dp[i]表示以nums[i]為結尾的最長上升子序列的長度n = len(nums)if n < 2:return ndp = [1] * nres = 0for i in range(1,n):for j in range(i):if nums[j]< nums[i]:dp[i] = max(dp[i], dp[j]+1)res = max(res, dp[i])               # 這么寫就需要考慮初值為1的時候return res

2.維度d


3.LeetCode-32 最長回文子串–是什么

獨自一個人也,也可以二維dp, 強!二維dp實際上也是以每個字符為中心向兩邊擴展的情況。
dp[i][j] 表示s[i]-s[j]子串是否是回文子串,依賴于s[i]==s[j] and dp[i+1][j-1]
狀態轉移決定了dp初始化元素(對角線)和更新的方向(由下向上,由對角線往右)

def longestPalindrome(self, s):n = len(s)if n < 2:          # 空字符和單個字符直接輸出return sdp = [[False] * n for _ in range(n)]for i in range(n):dp[i][i] = Trueres_str, res_len = s[0], 1    # 兩個字符的的時候,不相等時結果為單個字符for i in range(n-2,-1,-1):for j in range(i+1, n):if j == i+1:          # 次對角線上的元素單獨判斷。if s[i] == s[j]:dp[i][j] = Trueif j-i+1 > res_len:res_str = s[i:j+1]res_len = j - i + 1else:if s[i] == s[j] and dp[i+1][j-1]:dp[i][j] = Trueif j-i+1 > res_len:res_str = s[i:j+1]res_len = j - i + 1return res_str  

5.LeetCode-512 最長回文子序列–長度

和上題的基本思路一樣,不過dp數組表示的含義變為
dp[i][j] 表示s[i]-s[j]子串中回文序列的長度

# if s[i]==s[j]:dp[i][j] = dp[i+1][j-i]+2,
# if s[i]!=s[j]:dp[i][j] = max(dp[i+1][j],dp[i][j-1])
def longestPalindromeSubseq(self, s):n = len(s)if n < 2:return ndp = [[0] * n for _ in range(n)]for i in range(n):dp[i][i] = 1for i in range(n-2, -1, -1):for j in range(i+1,n):if s[j] == s[i]:dp[i][j] = dp[i+1][j-1] + 2else:dp[i][j] = max(dp[i+1][j], dp[i][j-1])return dp[0][n-1]

6.LeetCode-1143 最長公共子序列–長度

(兩個字符串,二維dp 才是標配嘛)
dp[i][j] 表示s1[0]-s1[i] 于s2[0]-s2[j] 的最長公共子序序列,更新形式于512題類似,只不過初值和方向不大一樣,初值為第0行第0列均為0,方向由上到下,由左到右。

def longestCommonSubsequence(self, text1, text2):l1, l2 = len(text1), len(text2)dp = [[0] * (l2 + 1) for _ in range(l1 + 1)]for i in range(1, l1 + 1):for j in range(1, l2 + 1):if text1[i-1] == text2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])# return dp[-1][-1]#  回溯 只有加res_str=[""]*dp[-1][-1]i,j=l1,l2while(i>0):if dp[i][j]>dp[i-1][j]:                   # 比上面的大,不是來上面if dp[i][j]>dp[i][j-1]:				  # 	比左邊的大,不是來自左邊res_str[dp[i][j]-1]=text1[i-1]    # 		來自對角線操作else:                                 # 	沒有左邊大,來自左邊 橫坐標操作i+=1							  # 		i 需要先+1,最后的-1會抵消j-=1								  # 	沒有左邊大,來自左邊,縱坐標操作i-=1print(res_str)

3.帶技巧解題


6.LeetCode-128 最長連續序列–長度

給定一個未排序的整數數組,找出最長連續序列的長度。要求算法的時間復雜度為 O(n)。

數組本身無序,連續序列有序,只要能找到連續序列的開頭,就能確定序列長度,迭代更新最長長度就可以了。

def longestConsecutive(self, nums):if not nums:return 0res = 1nums_set = set(nums)for val in nums_set:if val - 1 not in nums_set:     # val 為連續序列的開頭count = 1num = valwhile(num + 1 in nums_set):count += 1num = num + 1res = max(res, count)return res

7.LeetCode-14 最長公共前綴-字符串

暴力法:縱向掃描
先驗:最長公共前綴不回比最短的字符串長,所以先求出最短的長度。

def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str"""n = len(strs)if n == 0:return ""min_l = float("INF")for string in strs:min_l = min(len(string), min_l)i = 0con_pre = ""while(i < min_l):con_pre = strs[0][:i+1]for string in strs:if string[:i+1] != con_pre:return con_pre[:i]i += 1return con_pre

8.劍指offer-48 最長不含重復字符串的子字符串-長度

請從字符串中找出一個最長的不包含重復字符的子字符串,計算該最長子字符串的長度。

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3

移動窗口,保證窗口內的字符無重復,如果有重復就縮小窗口。

def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""win = {}left, right = 0, 0n = len(s)res = 0while (right < n):c1 = s[right]if win.get(c1):win[c1] += 1else:win[c1]  = 1right += 1while(win[c1]>1):c2 = s[left]win[c2] -=1left += 1res  = max(res, right - left)return res

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個簡單的游戲服務器框架 .

最近一段時間不是很忙&#xff0c;就寫了一個自己的游戲服務器框架雛形&#xff0c;很多地方還不夠完善&#xff0c;但是基本上也算是能夠跑起來了。我先從上層結構說起&#xff0c;一直到實現細節吧&#xff0c;想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

游戲登陸流程 .

當公司有很多游戲的時候&#xff0c;那么公司往往會有一個統一的賬號管理平臺&#xff0c;就就像盛大通行證、網易通行證&#xff0c;戰網平臺&#xff0c;這些平臺統一管理游戲的賬號數據。 打個比方&#xff0c;現在我們玩星辰變&#xff0c;那么玩家登陸游戲的時候…

leetcode97 交錯字符串

給定三個字符串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。 示例 1: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 輸出: true 示例 2: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 輸…

算法(27)-最大系列

最大系列1.LeetCode-239 滑動窗口的最大值2.LeetCode-53 連續子數組的最大和3.LeetCode-152 乘積最大的子數組。4.劍指 Offer 14- I. 剪繩子為k個整數段&#xff0c;使各個段成績最大1.dp數學推導1.LeetCode-239 滑動窗口的最大值 窗口由左往右最大值數組Left&#xff0c;和由…

mysql數據庫表的導入導出

MySQL寫入數據通常用insert語句&#xff0c;如 復制代碼 代碼如下: insert into person values(張三&#xff0c;20)&#xff0c;&#xff08;李四&#xff0c;21&#xff09;&#xff0c;&#xff08;王五&#xff0c;70&#xff09;…; 但有時為了更快速地插入大批量數據或…

leetcode 33 搜索旋轉排序數組 到處是細節的好題

這個題想了想就會做&#xff0c;只是細節真的能卡死人&#xff0c;找了好久的bug。甚至我懷疑我現在的代碼可能還有錯&#xff0c;只是沒例子測出來。 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如&#xff0c;數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1…

多線程中局部靜態變量初始化的陷阱

C當中常常需要一個全局唯一的對象實例&#xff0c;這時候&#xff0c;我們就會想到單件模式。如何實現這一模式&#xff1f;全局變量當然是一個簡單可行的方法&#xff0c;然而&#xff0c;這太丑陋。嗯&#xff0c;其實&#xff0c;丑陋倒也罷了&#xff0c;最嚴重的是它將引誘…

MachineLearning(8)-PCA,LDA基礎+sklearn 簡單實踐

PCA,LDA基礎sklearn 簡單實踐1.PCAsklearn.decomposition.PCA1.PCA理論基礎2.sklearn.decomposition.PCA簡單實踐2.LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis2.1 LDA理論基礎2.2 sklearn LDA簡單實踐1.PCAsklearn.decomposition.PCA 1.PCA理論基礎 PCA:&…

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

leetcode198 打家劫舍

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每個房屋存放金額的…

linux下的RPC

一、概述 在傳統的編程概念中&#xff0c;過程是由程序員在本地編譯完成&#xff0c;并只能局限在本地運行的一段代碼&#xff0c;也即其主程序和過程之間的運行關系是本地調用關系。因此這種結構在網絡日益發展的今天已無法適應實際需求。總而言之&#xff0c;傳統過程調用模式…

算法(28)--矩陣搜索系列

矩陣搜索1.leetcode-200. 島嶼數量2.leetcode-695. 島嶼的最大面積3.leetcode-463. 島嶼的周長4.劍指 Offer 12. 矩陣中的路徑5.leetcode-329. 矩陣中的最長遞增路徑6.leetcode-1091. 二進制矩陣中的最短路徑1.leetcode-200. 島嶼數量 給你一個由 ‘1’&#xff08;陸地&#…

leetcode213 打家劫舍II

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋&#xff0c;每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈&#xff0c;這意味著第一個房屋和最后一個房屋是緊挨著的。同時&#xff0c;相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子&#xff1a; 一、下載最新的 boost 庫&#xff0c;下載地址&#xff1a; http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫&#xff0c;推薦把 boost 庫解壓到 /usr/local/ 下&#xff1a; $ cd dowlo…

PaperNotes(4)-高質量圖像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1簡介1.2網絡結構與訓練1.3特點與用途2.Stack GAN2.1簡介2.2網絡結構與訓練2.3特點與用途3.Lap GAN3.1簡介3.2網絡結構與訓練3.3特點與用途4.Pix2pix GAN4.1 簡介4.2 網絡結構和訓練4.3 特點和用途5.Patch GAN6.Cy…

關于c++的一些案例

之前做項目的時候,有時候會用到位,也就是將一些數據放在二進制里,然后存在數據庫中或者緩存在服務器上,取出來,然后要判斷某位是不是置0或1,然后再將某位置0或1(比如領多個獎勵的 游戲邏輯),之前有點傻,竟然用 << ,>>這些運算符計算,今天翻起以前好久不…

C++(1)--概況、開發工具、hello word

簡介1. 概況2. 開發工具3. mac 寫hello word4. c 基本概念5.兩個數相加代碼分解5.1編譯預處理命令# include5.2輸入輸出庫iostream6.注釋7.編碼規范《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》1. 概況 20世紀70年代&a…

class 和 struct的區別

C中的struct對C中的struct進行了擴充&#xff0c;它已經不再只是一個包含不同數據類型的數據結構了&#xff0c;它已經獲取了太多的功能。 struct能包含成員函數嗎&#xff1f; 能&#xff01; struct能繼承嗎&#xff1f; 能&#xff01;&#xff01; struct能實現多態嗎&…

leetcode206 反轉鏈表

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題&#xff1f; 經典題不解釋 /*** Definition for singly-linked list.* public class ListNode…

淺議柔性數組

很多時候,柔性數組應用在了變長結構體中,如: StructPacket {Int state; Int len;