leetcode第354场周赛补题
发布人:shili8
发布时间:2024-12-29 16:46
阅读次数:0
**LeetCode 第354 场周赛补题**
### **1.有效的回文**
**难度:** 简单**描述:**
给定一个字符串 `s`,请你找出其中最长的有效回文子串。
回文是指正向(从左到右)和反向(从右到左)读取一致的字符串。
**示例1:**
输入:`"babad"`
输出:`["bab","aba"]`
**示例2:**
输入:`"cbbd"`
输出:`["bb","cb","dd"]`
**代码实现:**
def longestPalindrome(s): n = len(s) # dp[i][j] 表示 s[i..j] 是否为回文 dp = [[False] * (n +1) for _ in range(n +1)] max_len =0 start =0 # 初始化 dp[i][i] = True for i in range(n): dp[i][i] = True # 初始化 dp[i][j] = s[i..j] 为回文 for j in range(1, n +1): for i in range(j -1, -1, -1): if s[i] == s[j]: dp[i][j] = (i +1 < j -1 and dp[i +1][j -1]) or (i +1 == j -1) else: dp[i][j] = False # 找出最长回文子串 for i in range(n): for j in range(i, n): if dp[i][j]: max_len = max(max_len, j - i +1) start = i return [s[start:start + max_len]]
### **2. 最大矩形面积**
**难度:** 中等**描述:**
给定一个由正整数组成的数组 `height`,请你找出矩形的最大面积,其中矩形的宽度为 `i`,高度为 `height[i]`。
**示例1:**
输入:`[2,1,5,6,2,3]`
输出:`10`
**示例2:**
输入:`[2,4]`
输出:`4`
**代码实现:**
def maxArea(height): n = len(height) # dp[i][j] 表示 i..j 之间的最大面积 dp = [[0] * (n +1) for _ in range(n +1)] max_area =0 # 初始化 dp[i][i] = height[i] for i in range(n): dp[i][i] = height[i] # 初始化 dp[i][j] = min(height[i], height[j]) * (j - i) for j in range(1, n +1): for i in range(j -1, -1, -1): dp[i][j] = min(height[i], height[j]) * (j - i) # 找出最大面积 for i in range(n): for j in range(i, n): max_area = max(max_area, dp[i][j]) return max_area
### **3. 最长回文子序列**
**难度:** 中等**描述:**
给定一个由正整数组成的数组 `nums`,请你找出最长回文子序列。
**示例1:**
输入:`[1,2,3,4]`
输出:`1`
**示例2:**
输入:`[1,3,5,7]`
输出:`1`
**代码实现:**
def longestPalindromeSequence(nums): n = len(nums) # dp[i][j] 表示 i..j 之间的最长回文子序列长度 dp = [[0] * (n +1) for _ in range(n +1)] max_len =0 # 初始化 dp[i][i] =1 for i in range(n): dp[i][i] =1 # 初始化 dp[i][j] = min(dp[i+1][j], dp[i][j-1]) +1 for j in range(1, n +1): for i in range(j -1, -1, -1): if nums[i] == nums[j]: dp[i][j] = max(dp[i+1][j], dp[i][j-1]) +1 else: dp[i][j] = min(dp[i+1][j], dp[i][j-1]) # 找出最长回文子序列长度 for i in range(n): max_len = max(max_len, dp[i][i]) return max_len
### **4. 最大正方形**
**难度:** 中等**描述:**
给定一个由正整数组成的数组 `nums`,请你找出最大正方形。
**示例1:**
输入:`[2,3,5,7]`
输出:`9`
**示例2:**
输入:`[1,4,6,8]`
输出:`16`
**代码实现:**
def maxSquare(nums): n = len(nums) # dp[i][j] 表示 i..j 之间的最大正方形面积 dp = [[0] * (n +1) for _ in range(n +1)] max_area =0 # 初始化 dp[i][i] = nums[i] for i in range(n): dp[i][i] = nums[i] # 初始化 dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + nums[j] for j in range(1, n +1): for i in range(j -1, -1, -1): if nums[i] == nums[j]: dp[i][j] = max(dp[i+1][j], dp[i][j-1]) + nums[j] else: dp[i][j] = min(dp[i+1][j], dp[i][j-1]) # 找出最大正方形面积 for i in range(n): max_area = max(max_area, dp[i][i]) return max_area
### **5. 最长回文子序列**
**难度:** 中等**描述:**
给定一个由正整数组成的数组 `nums`,请你找出最长回文子序列。
**示例1:**
输入:`[1,2,3,4]`
输出:`1`
**示例2:**
输入:`[1,3,5,7]`
输出:`1`
**代码实现:**
def longestPalindromeSequence(nums): n = len(nums) # dp[i][j] 表示 i..j 之间的最长回文子序列长度 dp = [[0] * (n +1) for _ in range(n +1)] max_len =0 # 初始化 dp[i][i] =1 for i in range(n): dp[i][i] =1 # 初始化 dp[i][j] = min(dp[i+1][j], dp[i][j-1]) +1 for j in range(1, n +1): for i in range(j -1, -1, -1): if nums[i] == nums[j]: dp[i][j] = max(dp[i+1][j], dp[i][j-1]) +1 else: dp[i][j] = min(dp[i+1][j], dp[i][j-1]) # 找出最长回文子序列长度 for i in range(n): max_len = max(max_len, dp[i][i]) return max_len
### **6. 最大正方形**
**难度:** 中等**描述:**
给定一个由正整数组成的数组 `nums`,请你找出最大正方形。
**示例1:**
输入:`[2,3,5,7]`
输出:`9`
**示例2:**
输入:`[1,4,6,8]`
输出:`16`
**代码实现:**
def maxSquare(nums): n = len(nums) # dp[i][j] 表示 i..j 之间的最大正方形面积 dp = [[0] * (n +1) for _ in range(n +1)] max_area =0 # 初始化 dp[i][i] = nums[i] for i in range(n): dp[i][i] = nums[i] # 初始化 dp[i][j]