文章目录
一,不同的子序列
1,程序简介
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)
题目数据保证答案符合 32 位带符号整数范围。
示例 1:
- 输入:s = “rabbbit”, t = “rabbit”
- 输出:3
- 解释:
如下图所示, 有 3 种可以从 s 中得到
“rabbit” 的方案
。
rabbbit
rabbbit
rabbbit
示例 2:
- 输入:s = “babgbag”, t = “bag”
- 输出:5
- 解释:
如下图所示, 有 5 种可以从 s 中得到
“bag” 的方案
。
babgbag
babgbag
babgbag
babgbag
babgbag
提示:
- 0 <= s.length, t.length <= 1000
- s 和 t 由英文字母组成
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 12 19:00:26 2022
Function: 不同的子序列
@author: 小梁aixj
"""
class Solution:
def numDistinct(self, s: str, t: str) -> int:
if t == "" and s == "":
return 0
if t == "":
return 1
dp = [[0 for i in range(len(s) + 1)] for j in range(len(t) + 1)]
for j in range(0, len(s) + 1):
dp[0][j] = 1
for i in range(1, len(t) + 1):
for j in range(1, len(s) + 1):
dp[i][j] = dp[i][j - 1]
if s[j - 1] == t[i - 1]:
dp[i][j] += dp[i - 1][j - 1]
return dp[-1][-1]
二,最短回文串
1,程序简介
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
- 输入:s = “aacecaaa”
- 输出:“aaacecaaa”
示例 2:
- 输入:s = “abcd”
- 输出:“dcbabcd”
提示:
- 0 < = s . l e n g t h < = 5 ∗ 1 0 4 0 <= s.length <= 5 * 10^4 0<=s.length<=5∗104
- s 仅由小写英文字母组成
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 12 19:00:38 2022
Function: 最短回文串
@author: 小梁aixj
"""
class Solution:
def shortestPalindrome(self, s: str) -> str:
N = len(s)
idx1 = 0
for idx2 in range(N - 1, -1, -1):
if s[idx1] == s[idx2]:
idx1 += 1
if idx1 == N:
return s
return s[idx1:][::-1] + self.shortestPalindrome(s[:idx1]) + s[idx1:]
三,俄罗斯套娃信封问题
1,程序简介
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:
- 不允许旋转信封。
示例 1:
- 输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
- 输出:3
- 解释:最多信封的个数为
3, 组合为:
[2,3] => [5,4] => [6,7]。
示例 2:
- 输入:envelopes = [[1,1],[1,1],[1,1]]
- 输出:1
提示:
- 1 <= envelopes.length <= 5000
- envelopes[i].length == 2
- 1 < = w i , h i < = 1 0 4 1 <= wi, hi <= 10^4 1<=wi,hi<=104
2,程序代码
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 12 18:59:59 2022
Function: 俄罗斯套娃信封问题
@author: 小梁aixj
"""
class Solution:
def maxEnvelopes(self, envelopes) -> int:
"""
:param envelopes: List[List[int]]
:return: int
"""
n = len(envelopes)
if not n:
return 0
envelopes.sort(key=lambda x: (x[0], -x[1]))
dp = [1] * n
for i in range(n):
for j in range(i):
if envelopes[j][1] < envelopes[i][1]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)